Je veux appliquer une fonction avec des arguments à une série en pandas python:
x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...
La documentation décrit la prise en charge d'une méthode apply, mais elle n'accepte aucun argument. Existe-t-il une méthode différente qui accepte les arguments? Sinon, est-ce que je manque une solution de contournement simple?
Mise à jour (octobre 2017): notez que depuis que cette question a été posée à l'origine, les pandas apply()
ont été mis à jour pour gérer les arguments de position et de mot-clé et le lien de documentation ci-dessus reflète maintenant cela et montre comment inclure l'un ou l'autre type d'argument.
functools.partial
, oustarmap
?DataFrame.apply
documents et lesSeries.apply
documentsRéponses:
Les nouvelles versions de pandas vous permettent de passer des arguments supplémentaires (voir la nouvelle documentation ). Alors maintenant, vous pouvez faire:
Les arguments positionnels sont ajoutés après l'élément de la série.
Pour les anciennes versions de pandas:
La documentation l'explique clairement. La méthode apply accepte une fonction python qui doit avoir un seul paramètre. Si vous souhaitez passer plus de paramètres, vous devez utiliser
functools.partial
comme suggéré par Joel Cornett dans son commentaire.Un exemple:
Vous pouvez également transmettre des arguments de mots clés à l'aide de
partial
.Une autre façon serait de créer un lambda:
Mais je pense que
partial
c'est mieux d' utiliser .la source
args
argument, qui est un tuple contenant des arguments positionnels supplémentaires ou ** kwds pour ceux nommés. J'ai créé un problème pour l'avoir également pour Series.apply () github.com/pydata/pandas/issues/1829'abc'
, ilargs=('abc')
sera évalué comme trois arguments('a', 'b', 'c')
. Pour éviter cela, vous devez passer un tuple contenant la chaîne, et pour ce faire, inclure une virgule de fin:args=('abc',)
Pas:
Exemple
Le résultat de cet exemple est que chaque numéro de la trame de données sera ajouté au numéro 9.
Explication:
La fonction "ajouter" a deux paramètres: i1, i2. Le premier paramètre va être la valeur dans la trame de données et le second est tout ce que nous passons à la fonction «appliquer». Dans ce cas, nous passons "9" à la fonction apply en utilisant le mot-clé argument "i2".
la source
la source
func
. Donc, si je souhaite postuler,pd.Series.mean(axis=1)
comment puis-je mettre leaxis=1
?Vous pouvez transmettre n'importe quel nombre d'arguments à la fonction qui
apply
appelle via des arguments sans nom, passés sous forme de tuple auargs
paramètre ou via d'autres arguments de mot-clé capturés en interne sous forme de dictionnaire par lekwds
paramètre.Par exemple, construisons une fonction qui renvoie True pour les valeurs comprises entre 3 et 6, et False sinon.
Cette fonction anonyme n'est pas très flexible. Créons une fonction normale avec deux arguments pour contrôler les valeurs min et max que nous voulons dans notre série.
Nous pouvons répliquer la sortie de la première fonction en passant des arguments sans nom à
args
:Ou nous pouvons utiliser les arguments nommés
Ou même une combinaison des deux
la source