Quero aplicar uma função com argumentos a uma série em pandas python:
x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...
A documentação descreve o suporte a um método apply, mas não aceita argumentos. Existe um método diferente que aceite argumentos? Como alternativa, estou faltando uma solução alternativa simples?
Atualização (outubro de 2017): observe que desde que essa pergunta foi feita originalmente, o pandas apply()
foi atualizado para lidar com argumentos posicionais e de palavras-chave e o link da documentação acima agora reflete isso e mostra como incluir qualquer tipo de argumento.
functools.partial
, oustarmap
?DataFrame.apply
documentos eSeries.apply
documentosRespostas:
Versões mais recentes do pandas fazer permitem passar argumentos extras (ver a nova documentação ). Então agora você pode fazer:
Os argumentos posicionais são adicionados após o elemento da série.
Para uma versão mais antiga do pandas:
A documentação explica isso claramente. O método apply aceita uma função python que deve ter um único parâmetro. Se você quiser passar mais parâmetros, use
functools.partial
como sugerido por Joel Cornett em seu comentário.Um exemplo:
Você também pode passar argumentos de palavras-chave usando
partial
.Outra maneira seria criar um lambda:
Mas acho que usar
partial
é melhor.fonte
args
argumento, que é uma tupla contendo argumentos posicionais adicionais ou ** kwds para os nomeados. Eu criei uma questão de ter isso também para Series.apply () github.com/pydata/pandas/issues/1829'abc'
,args=('abc')
será avaliado como três argumentos('a', 'b', 'c')
. Para evitar isso, você deve passar uma tupla contendo a string e, para isso, incluir uma vírgula à direita:args=('abc',)
Passos:
Exemplo
O resultado deste exemplo é que cada número no quadro de dados será adicionado ao número 9.
Explicação:
A função "add" possui dois parâmetros: i1, i2. O primeiro parâmetro será o valor no quadro de dados e o segundo é o que passarmos para a função "aplicar". Nesse caso, estamos passando "9" para a função aplicar usando o argumento de palavra-chave "i2".
fonte
fonte
func
. Então, se eu quiser me inscrever,pd.Series.mean(axis=1)
como coloco oaxis=1
?Você pode passar qualquer número de argumentos para a função que
apply
está chamando por argumentos não nomeados, passados como uma tupla para oargs
parâmetro ou por outros argumentos de palavras-chave capturados internamente como um dicionário pelokwds
parâmetro.Por exemplo, vamos criar uma função que retorne True para valores entre 3 e 6 e False caso contrário.
Esta função anônima não é muito flexível. Vamos criar uma função normal com dois argumentos para controlar os valores mínimo e máximo que queremos em nossa série.
Podemos replicar a saída da primeira função passando argumentos sem nome para
args
:Ou podemos usar os argumentos nomeados
Ou mesmo uma combinação de ambos
fonte