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)