#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)