Pandas: как использовать функцию приложения для нескольких столбцов

У меня есть некоторые проблемы с функцией приложения Pandas при использовании нескольких столбцов со следующим фреймворком данных

df = DataFrame ({'a' : np.random.randn(6),
             'b' : ['foo', 'bar'] * 3,
             'c' : np.random.randn(6)})

и следующей функции

def my_test(a, b):
    return a % b

Когда я пытаюсь применить эту функцию с помощью:

df['Value'] = df.apply(lambda row: my_test(row[a], row[c]), axis=1)

Я получаю сообщение об ошибке:

NameError: ("global name 'a' is not defined", u'occurred at index 0')

Я не понимаю этого сообщения, я правильно определил имя.

Я был бы очень признателен за любую помощь по этой проблеме

Update

Спасибо за вашу помощь. Я сделал некоторые синтаксические ошибки с кодом, индекс должен быть помещен ''. Однако у меня есть еще одна проблема с использованием более сложной функции, например:

def my_test(a):
    cum_diff = 0
    for ix in df.index():
        cum_diff = cum_diff + (a - df['a'][ix])
    return cum_diff 

Спасибо

Ответы

Ответ 1

Кажется, вы забыли '' вашей строки.

In [43]: df['Value'] = df.apply(lambda row: my_test(row['a'], row['c']), axis=1)

In [44]: df
Out[44]:
                    a    b         c     Value
          0 -1.674308  foo  0.343801  0.044698
          1 -2.163236  bar -2.046438 -0.116798
          2 -0.199115  foo -0.458050 -0.199115
          3  0.918646  bar -0.007185 -0.001006
          4  1.336830  foo  0.534292  0.268245
          5  0.976844  bar -0.773630 -0.570417

Кстати, по-моему, следующий путь более изящный:

In [53]: def my_test2(row):
....:     return row['a'] % row['c']
....:     

In [54]: df['Value'] = df.apply(my_test2, axis=1)

Ответ 2

Если вы просто хотите вычислить (столбец a)% (столбец b), вам не нужно apply, просто сделайте это прямо:

In [7]: df['a'] % df['c']                                                                                                                                                        
Out[7]: 
0   -1.132022                                                                                                                                                                    
1   -0.939493                                                                                                                                                                    
2    0.201931                                                                                                                                                                    
3    0.511374                                                                                                                                                                    
4   -0.694647                                                                                                                                                                    
5   -0.023486                                                                                                                                                                    
Name: a

Ответ 3

Скажем, мы хотим применить функцию add5 к столбцам 'a' и 'b' DataFrame df

def add5(x):
    return x+5

df[['a', 'b']].apply(add5)