запустите df.apply с помощью лямбда-функции в цикле

#python #pandas #dataframe #data-analysis #attributeerror

Вопрос:

Этот фрагмент кода работает хорошо:

 df['art_kennz'] = df.apply(lambda x:myFunction(x.art_kennz), axis=1)
 

Однако здесь я жестко закодировал имя столбца art_kennz в обоих местах: df['art_kennz'] и x.art_kennz . Теперь я хочу изменить сценарий таким образом, чтобы у меня был список имен столбцов и запуск df.apply для всех этих столбцов. Поэтому я попробовал это:

 cols_with_spaces = ['art_kennz', 'fk_wg_sch']
for col_name in cols_with_spaces:
    df[col_name] = df.apply(lambda x: myFunction(x.col_name)
                                               , axis=1)
 

но это приводит к ошибке, которая:

 AttributeError: 'Series' object has no attribute 'col_name'
 

потому x.col_name что. Здесь col_name должен быть элементом из цикла for. Каков был бы правильный синтаксис для этого?

Комментарии:

1. Если myFunction может работать с сериями, вы можете использовать: df[list_of_cols] = df[list_of_cols].применить(лямбда x: myFunction(x), ось=1)

Ответ №1:

Попробуй:

 for col_name in cols_with_spaces:
    df[col_name] = df.apply(lambda x: myFunction(x[col_name])
 

Пояснение: Вы можете получить доступ к серии , например x.art_kennz , с помощью синтаксиса атрибутов, но, поскольку col_name это переменная, содержащая строку, представляющую атрибут, синтаксис скобок является правильным способом.

Ответ №2:

В этом случае x.art_kennz вы используете строку, но в for-loop вас есть переменные, которые вы не можете использовать .variables .

попробуйте это: (При таком подходе вы повторяете строку за строкой)

 for col_name in cols_with_spaces:
    df[col_name] = df.apply(lambda row: myFunction(row[col_name]), axis=1)
 

Если вы хотите перебирать столбцы по столбцам, вы можете попробовать это:

 for col_name in cols_with_spaces:
    df[col_name] = df[col_name].apply(myFunction)