#python #pandas
#python #pandas
Вопрос:
Я пытаюсь применить функцию к фрейму данных, создавая в результате новый столбец, вот так:
def defensive_weights(DSp=None,SGp=None,FCp=None):
if dfcrop['opp_goals'] == 0:
DInd = (DSp*2 SGp FCp)
else:
DInd = (DSp SGp FCp)
return DInd
dfcrop['IED'] = dfcrop['opp_goals'].apply(defensive_weights, DSp=DSp,SGp=SGp,FCp=FCp)
Я получаю:
TypeError: defensive_weights() got multiple values for argument 'DSp'
Чего я не понимаю?
Комментарии:
1. Первым аргументом функции должна быть серия, которую вы ей передаете. Итак, в вашем случае добавьте аргумент
x
(или какое-нибудь лучшее имя) и заменитеdfcrop['opp_goals']
наx
внутри вызова функции.2. не могли бы вы, пожалуйста, ответить, чтобы было понятнее?
Ответ №1:
Похоже, вы вызываете всю серию фреймов данных из функции. Я не думаю, что вы хотите это делать. Вы должны разрешить функции принимать параметр и передавать его условному:
def defensive_weights(item, DSp=None,SGp=None,FCp=None):
if item == 0:
DInd = (DSp*2 SGp FCp)
else:
DInd = (DSp SGp FCp)
return DInd
Допустим, dfcrop[‘opp_goals’] == [1, 2, 3, 4, 5]
Прямо сейчас ваша функция пытается это сделать:
if [1,2,3,4,5] == 0:
В этом случае он всегда возвращал бы false.
Он передает весь столбец для каждой строки, потому что вы вызываете его из функции.
У меня такое чувство, что вы хотите, чтобы это делало это:
if 2 == 0
или
if 0 == 0
Итак, вам нужно предоставить функции только эти целые числа. Вы делаете это, вводя их один за другим, что на самом деле нелегко сделать изнутри функции, вам нужно создать параметр функции (я назвал его «item») и вводить их один за другим, используя ваш метод «apply».
Кроме того, ваш синтаксис apply вызывает всю строку и пытается передать ее первому параметру. Я бы рекомендовал использовать лямбда-выражение для управления тем, какие столбцы переходят к каким параметрам:
dfcrop.apply(lambda x: defensive_weights(x.opp_goals, DSp=x.DSp,SGp=x.SGp,FCp=x.FCp), axis=1)
Я не знаю, как выглядят ваши данные, поэтому я предполагаю, что у вас есть несколько столбцов, названных в честь этих именованных параметров.
Редактировать: Вот простой пример функции, переданной методу apply, который должен проиллюстрировать основные принципы использования apply:
a = pd.DataFrame({'a':[1,2,3,4], 'b':[5,6,7,8]})
def modder(x,y):
return x**y
a['c'] = a.apply(lambda x: modder(x.a, x.b), axis=1)
a
Комментарии:
1. Ошибка атрибута: («Объект ‘Series’ не имеет атрибута ‘opp_goals'», «произошел в номе индекса»)
2. Я не знаю, как выглядят ваши данные, поэтому, если вы можете предоставить несколько строк, это было бы полезно. Кроме того, я забыл аргумент «axis». Немного изменил мой ответ.