pandas, применяется с аргументами, которые являются записями строк фрейма данных

#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