Перебрать столбцы и выполнить расчет - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь написать цикл for с оператором if, который перебирает столбцы и выполняет некоторое умножение, создавая новый столбец в кадре данных.

До сих пор я достиг этого, но это явно неправильно, и никакие столбцы не генерируются.Любые намеки или предложения высоко ценится!

for i in df[1:]:
    if  i == 'a' or i == 'b' or i == 'b':
        data[i] = df[i]* 4
    elif i == 'CZK_fwdp':
        data[i] = df[i]* 7
    else:
        data[i] = df[i]* 5
break    

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Это датафрейм, чтобы вы могли сделать что-то вроде ниже

for _, row in df.iterrows():
    if  row['col1'] == 'a' or row['col1'] == 'b' or row['col1'] == 'c':
        row['col1'] = row['col1']* 4
    elif row['col1'] == 'CZK_fwdp':
        row['col1'] = row['col1']* 7
    else:
        row['col1'] = row['col1']* 5
0 голосов
/ 18 октября 2018

Я создал пример того, как я обычно выполняю одни и те же задачи:

df = pd.DataFrame({'a': [1,1,1], 'b': [1,2,3], 'c': [0,-1,-2]})
print(df)
Out:
   a  b  c
0  1  1  0
1  1  2 -1
2  1  3 -2

Это примерный фрейм данных.Вы можете применить некоторую функцию для изменения всех ее столбцов в зависимости от имени столбца, доступного атрибута throgh name.Например, столбец 'a' имеет только имя a:

df['a'].name
Out:
'a'

def mapper(name):
    return name + '_new'


df_new = df.apply(lambda col: col * 4 if col.name == 'a' or col.name == 'b' 
         else col * 7 if col.name == 'CZK_fwdp' 
         else col * 5, axis=0).rename(mapper=mapper, axis=1)
print(df_new)
Out:
   a_new  b_new  c_new
0      4      4      0
1      4      8     -5
2      4     12    -10

Используйте метод apply, чтобы применить вашу лямбда-функцию вдоль столбцов с аргументом axis = 1.Функция mapper используется, чтобы избежать вмешательства имен столбцов.Чтобы получить нужный фрейм данных, вы можете просто объединить старый и новый фреймы данных:

df_conc = pd.concat((df, df_new), axis=1)
print(df_conc)
Out:
   a  b  c  a_new  b_new  c_new
0  1  1  0      4      4      0
1  1  2 -1      4      8     -5
2  1  3 -2      4     12    -10

Если вам не нравятся лямбда-функции, вы можете использовать общую функцию:

def modify_column(col):
    if col.name == 'a' or col.name == 'b':
        return col * 4
    elif col.name == 'CZK_fwdp':
        return col * 7
    else:
        return col * 5

df_new = df.apply(modify_column, axis=0).rename(mapper=mapper, axis=1)
0 голосов
/ 18 октября 2018

Не могли бы вы дать нам код, который определяет переменную df, пожалуйста?

Помните, что кадр данных немного сложнее, чем список.Вы должны указать столбец, с которым хотите работать (см. документацию ).

Первая строка вашего кода, вероятно, должна быть заменена чем-то вроде:

for i in df['name_of_your_column']:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...