У меня есть два столбца: 'form_field' и 'field_value', например:

   form_field   field_value
0            1             4
1            2             4
2            3             1
3            4             1
4            5             4
5            6             1
6            7             1
7            8             3
8            9             1

Теперь я хочу наверняка form_fileds, чтобы соответствующее ему значение в field_value было заменено. например, например, для form_field 1,4,9 я хочу, чтобы field_values ​​было изменено таким образом, что если это 1, то измените его на 4, если это 2, то измените его на 3, если 3 измените его на 2 и если 4 измените его на 1. Я попытался поместить все значения form_filed, которые необходимо изменить, в список с именем «e» и выполнил следующий код:

import pandas as pd
import matplotlib.pyplot as plt
import os
import numpy as np


all_files = os.listdir("Trap_data/") 
os.chdir(r"Trap_data/") 
e=[1,2,5,8,10,11,15,16,19,20,21,23,26,27,30,33,34,36,39]

for file in all_files:  

    f_name = file
    df_1 = pd.read_csv(f_name,nrows=40)
    
    for i in e:
      
        df_1['form_field'][i] = pd.to_numeric((df_1[' field_value'][i]), errors='coerce').replace([1,2,3,4],[4,3,2,1])
print(df_1)

Однако это вызывает ошибку:

AttributeError: 'numpy.int64' object has no attribute 'replace'
0
Kshtj 12 Июн 2021 в 20:36

2 ответа

Лучший ответ

Вы можете изменить свой код на:

#e=[1,2,5,8,10,11,15,16,19,20,21,23,26,27,30,33,34,36,39]
e= [1, 4, 9]

val_map = {1: 4, 2: 3, 3: 2, 4: 1}

df.loc[df['form_field'].isin(e), 'field_value'] = pd.to_numeric(df['field_value'], errors='coerce').replace(val_map)

Результат:

print(df)

   form_field   field_value
0            1             4
1            2             4
2            3             1
3            4             1
4            5             4
5            6             1
6            7             1
7            8             3
8            9             1
1
SeaBean 12 Июн 2021 в 19:44

Используя эти данные:

   form_field   field_value
0            1             4
1            2             4
2            3             1
3            4             1
4            5             4
5            6             1
6            7             1
7            8             3
8            9             1

Тогда:

# copy the above, read into dataframe
# df = pd.read_clipboard(sep="\s+")

maps = {
    1: 4,
    2: 3,
    3: 2,
    4: 1,
}

df.loc[df["form_field"].isin(maps.keys()), "field_value"] = df.loc[
    df["form_field"].isin(maps.keys()), "form_field"
].replace(maps)

Дает:

   form_field  field_value
0           1            4
1           2            3
2           3            2
3           4            1
4           5            4
5           6            1
6           7            1
7           8            3
8           9            1

1
baxx 12 Июн 2021 в 18:07