web-dev-qa-db-fra.com

python pandas: applique 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)
...

La documentation décrit la prise en charge d'une méthode apply, mais 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, que pandas apply() a été mis à jour pour gérer Les arguments de position et de mot-clé et le lien de documentation ci-dessus le reflètent maintenant et montre comment inclure l'un ou l'autre type d'argument.

105
Abe

La documentation explique cela clairement. La méthode apply accepte une fonction python qui devrait avoir un seul paramètre. Si vous voulez passer plus de paramètres, vous devriez utiliser functools.partial comme suggéré par 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.

Une autre façon serait de créer un lambda:

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

Mais je pense que l’utilisation de partial est préférable.


Notez que les versions les plus récentes de pandas do vous permettent de passer des arguments supplémentaires (voir le nouvelle documentation ) . Alors maintenant, vous pouvez faire:

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

Les arguments de position sont ajoutés après l'élément de la série.

127
Bakuriu

Étapes:

  1. Créer une dataframe
  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 la trame 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 va être la valeur dans la trame 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 le mot clé argument "i2".

54
FistOfFury
Series.apply(func, convert_dtype=True, args=(), **kwds)

args : Tuple

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

Vous pouvez transmettre un nombre quelconque d'arguments à la fonction que apply appelle via des arguments non nommés, transmis sous forme de tuple au paramètre args, ou via d'autres arguments de mot clé capturés en interne sous forme de dictionnaire par le paramètre kwds paramètre.

Par exemple, construisons une fonction qui renvoie True pour les valeurs comprises entre 3 et 6 et False 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 répliquer le résultat 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)
18
Ted Petrou