Tenho alguns problemas com a função de aplicação do Pandas, ao usar várias colunas com o seguinte quadro de dados
df = DataFrame ({'a' : np.random.randn(6),
'b' : ['foo', 'bar'] * 3,
'c' : np.random.randn(6)})
e a seguinte função
def my_test(a, b):
return a % b
Quando tento aplicar esta função com:
df['Value'] = df.apply(lambda row: my_test(row[a], row[c]), axis=1)
Eu recebo a mensagem de erro:
NameError: ("global name 'a' is not defined", u'occurred at index 0')
Não entendi esta mensagem, defini o nome corretamente.
Eu apreciaria muito qualquer ajuda sobre esta questão
Atualizar
Obrigado pela ajuda. Cometi alguns erros de sintaxe com o código, o índice deve ser colocado ''. No entanto, ainda recebo o mesmo problema usando uma função mais complexa, como:
def my_test(a):
cum_diff = 0
for ix in df.index():
cum_diff = cum_diff + (a - df['a'][ix])
return cum_diff
my_test(a)
não sabe o que df
é, pois não foi passada como argumento (a menos que df
seja suposto ser global, o que seria uma prática terrível). Você precisa passar todos os valores necessários dentro de uma função como argumentos (de preferência em ordem); caso contrário, de que outra forma a função saberia de onde df
vem? Além disso, é uma prática ruim programar em um espaço para nome repleto de variáveis globais; você não detectará erros como esse.
apply
o máximo possível. Se você não tem certeza de que precisa usá-lo, provavelmente não precisa. Eu recomendo dar uma olhada em Quando devo usar pandas apply () no meu código? .