#python #pandas #apply #args
#python #pandas #применить #аргументы
Вопрос:
У меня есть фрейм данных pandas ‘df’ с двумя столбцами ‘A’ и ‘B’, у меня есть функция с двумя аргументами
def myfunction(B, A):
# do something here to get the result
return result
и я хотел бы применить его построчно к df, используя функцию «применить»
df['C'] = df['B'].apply(myfunction, args=(df['A'],))
но я получаю сообщение об ошибке
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
что здесь происходит, кажется, что он принимает df[‘A’] как целую серию! не только запись строки из этой серии, как требуется.
Ответ №1:
Я думаю, вам нужно:
import pandas as pd
df = pd.DataFrame({'A':[1,2,3],
'B':[4,5,6]})
print (df)
A B
0 1 4
1 2 5
2 3 6
def myfunction(B, A):
#some staff
result = B A
# do something here to get the result
return result
df['C'] = df.apply(lambda x: myfunction(x.B, x.A), axis=1)
print (df)
A B C
0 1 4 5
1 2 5 7
2 3 6 9
Или:
def myfunction(x):
result = x.B x.A
# do something here to get the result
return result
df['C'] = df.apply(myfunction, axis=1)
print (df)
A B C
0 1 4 5
1 2 5 7
2 3 6 9
Комментарии:
1. почему я не могу использовать аргумент ‘args’ для функции apply?
2. @RunnerBean вы можете передавать аргументы просто отлично.
apply
принимаетkwargs
, поэтому вы можете передавать аргументы следующим образом:df['B'].apply(myfunction, A=df['A'])
Но в этом случае это плохая идея, поскольку вы будете передавать целую серию в функцию, применяемую в каждой строке.
Ответ №2:
Я бы добавил еще один метод, который может быть полезен, когда вам нужно передать все столбцы в функцию.
Мы считаем, что согласно pandas.DataFrame.apply
документам: объекты, переданные функции, являются объектами серии. Итак, мы преобразуем pd.Series
в list
. Затем распакуйте его с помощью *
operator во время вызова нашей функции.
import pandas as pd
df = pd.DataFrame({'A':[1,2,3],
'B':[4,5,6]})
print (df)
A B
0 1 4
1 2 5
2 3 6
def myfunction(B, A):
#some staff
result = B A
# do something here to get the result
return result
df['C'] = df.apply(lambda x: myfunction(*x.to_list()), axis=1)
print (df)
A B C
0 1 4 5
1 2 5 7
2 3 6 9