python - index - pandas syntax




Python Panda: applica una funzione con argomenti a una serie (3)

Voglio applicare una funzione con argomenti a una serie in Python Panda:

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

La documentation descrive il supporto per un metodo apply, ma non accetta alcun argomento. Esiste un metodo diverso che accetta argomenti? In alternativa, mi manca una soluzione semplice?

Aggiornamento (ottobre 2017): Si noti che poiché a questa domanda è stato inizialmente chiesto che pandas apply() sia stato aggiornato per gestire gli argomenti posizionali e parola chiave e il collegamento della documentazione sopra ora riflette ciò e mostra come includere entrambi i tipi di argomento.


È possibile passare qualsiasi numero di argomenti alla funzione che apply chiamando sia gli argomenti senza nome, passati come una tupla al parametro args , sia attraverso altri argomenti di parole chiave acquisiti internamente come un dizionario dal parametro kwds .

Ad esempio, costruiamo una funzione che restituisce True per i valori compresi tra 3 e 6 e False altrimenti.

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

Questa funzione anonima non è molto flessibile. Creiamo una normale funzione con due argomenti per controllare i valori minimo e massimo che vogliamo nella nostra serie.

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

Possiamo replicare l'output della prima funzione passando argomenti senza nome a args :

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

O possiamo usare gli argomenti nominati

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

O anche una combinazione di entrambi

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

La documentazione lo spiega chiaramente. Il metodo apply accetta una funzione python che dovrebbe avere un singolo parametro. Se vuoi passare più parametri dovresti usare functools.partial come suggerito da Joel Cornett nel suo commento.

Un esempio:

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

Puoi anche passare gli argomenti delle parole chiave usando partial .

Un altro modo sarebbe creare un lambda:

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

Ma penso che usare partial sia meglio.

Nota che le versioni più recenti dei panda ti permettono di passare argomenti extra (vedi la nuova documentazione ). Quindi ora puoi fare:

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

Gli argomenti posizionali vengono aggiunti dopo l'elemento della serie.


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

args : tuple

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




apply