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
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? .my_test(a)
não sabe o quedf
é, pois não foi passada como argumento (a menos quedf
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 ondedf
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.Respostas:
Parece que você esqueceu o
''
seu fio.BTW, na minha opinião, da seguinte maneira é mais elegante:
fonte
pythonista
devido a algumas perspectivas, incluindo esta.Se você deseja apenas calcular (coluna a)% (coluna b), não precisa
apply
, basta fazê-lo diretamente:fonte
Digamos que queremos aplicar uma função add5 às colunas 'a' e 'b' do DataFrame df
fonte
Todas as sugestões acima funcionam, mas se você quiser que seus cálculos sejam mais eficientes, aproveite as operações de vetores numpy (como indicado aqui) .
Exemplo 1: loop com
pandas.apply()
:Exemplo 2: vetorizar usando
pandas.apply()
:Exemplo 3: vetorizar usando matrizes numpy:
Portanto, a vetorização usando matrizes numpy melhorou a velocidade em quase duas ordens de magnitude.
fonte
Isso é igual à solução anterior, mas eu defini a função no próprio df.apply:
fonte
Eu dei a comparação dos três discutidos acima.
Usando valores
139 µs ± 1,91 µs por loop (média ± desvio padrão de 7 execuções, 10000 loops cada)
Sem valores
216 µs ± 1,86 µs por loop (média ± desvio padrão de 7 execuções, 1000 loops cada)
Aplicar função
474 µs ± 5,07 µs por loop (média ± desvio padrão de 7 execuções, 1000 loops cada)
fonte