215 votes

python pandas : appliquer une fonction avec des arguments à une série

Je veux appliquer une fonction avec des arguments à une série dans python pandas :

x = my_series.apply(my_function, more_arguments_1)
y = my_series.apply(my_function, more_arguments_2)
...

El documentation décrit la prise en charge d'une méthode d'application, mais elle n'accepte aucun argument. Existe-t-il une autre méthode qui accepte les arguments ? Ou bien, ai-je manqué une solution de contournement simple ?

Mise à jour (octobre 2017) : Notez que depuis que cette question a été posée à l'origine que les pandas apply() a été mis à jour pour gérer les arguments positionnels et les mots-clés et le lien de documentation ci-dessus reflète maintenant cela et montre comment inclure l'un ou l'autre type d'argument.

236voto

Bakuriu Points 22607

Nouvelles versions de pandas faire vous permettent de passer des arguments supplémentaires (voir le nouvelle documentation ). Donc maintenant vous pouvez le faire :

my_series.apply(your_function, args=(2,3,4), extra_kw=1)

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 la méthode functools.partial comme le suggère Joel Cornett dans son commentaire.

Un exemple :

>>> import functools
>>> import operator
>>> add_3 = functools.partial(operator.add,3)
>>> add_3(2)
5
>>> add_3(7)
10

Vous pouvez également passer des arguments de mots-clés en utilisant partial .

Un autre moyen serait de créer un lambda :

my_series.apply((lambda x: your_func(a,b,c,d,...,x)))

Mais je pense qu'utiliser partial est meilleur.

112voto

FistOfFury Points 630

Des pas :

  1. Créer un cadre de données
  2. Créer une fonction
  3. Utilisez les arguments nommés de la fonction dans l'instruction apply.

Exemple

x=pd.DataFrame([1,2,3,4])  

def add(i1, i2):  
    return i1+i2

x.apply(add,i2=9)

Le résultat de cet exemple est que chaque nombre dans le cadre de données sera ajouté au nombre 9.

    0
0  10
1  11
2  12
3  13

Explication :

La fonction "add" a deux paramètres : i1, i2. Le premier paramètre sera la valeur dans le cadre de données et le second est ce que nous passons à la fonction "apply". Dans ce cas, nous passons "9" à la fonction "apply" en utilisant l'argument mot-clé "i2".

50voto

dani_g Points 509
Series.apply(func, convert_dtype=True, args=(), **kwds)

args : tuple

x = my_series.apply(my_function, args = (arg1,))

32voto

Ted Petrou Points 20559

Vous pouvez passer n'importe quel nombre d'arguments à la fonction qui apply est appelé par le biais d'arguments non nommés, passés sous forme de tuple à la fonction args ou par le biais d'autres arguments de mots-clés capturés en interne sous forme de dictionnaire par la commande kwds paramètre.

Par exemple, construisons une fonction qui renvoie Vrai pour les valeurs entre 3 et 6, et Faux sinon.

s = pd.Series(np.random.randint(0,10, 10))
s

0    5
1    3
2    1
3    1
4    6
5    0
6    3
7    4
8    9
9    6
dtype: int64

s.apply(lambda x: x >= 3 and x <= 6)

0     True
1     True
2    False
3    False
4     True
5    False
6     True
7     True
8    False
9     True
dtype: bool

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.

def between(x, low, high):
    return x >= low and x =< high

Nous pouvons reproduire la sortie de la première fonction en passant des arguments non nommés à args :

s.apply(between, args=(3,6))

Ou nous pouvons utiliser les arguments nommés

s.apply(between, low=3, high=6)

Ou même une combinaison des deux

s.apply(between, args=(3,), high=6)

2voto

#sample dataframe

import pandas as pd

df1=pd.DataFrame({'a':[3,4,7],'b':[4,2,2]})

#my function

def add_some(p,q,r):return p+q+r

df2=df1[["a","b"]].apply(add_some, args=(3,2))

print(df2)

_ a b

0 8 9

1 9 7

2 12 7

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X