Python Pandas: aplicar una función con argumentos a una serie.

Quiero aplicar una función con argumentos a una serie en pandas python:

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

La documentación describe el soporte para un método de aplicación, pero no acepta ningún argumento. ¿Hay algún método diferente que acepte argumentos? Alternativamente, ¿me estoy perdiendo una solución simple?

Actualización (octubre de 2017): tenga en cuenta que, desde que se hizo esta pregunta originalmente, pandas apply() se ha actualizado para manejar los argumentos posicionales y de palabras clave, y el enlace de documentación anterior ahora refleja eso y muestra cómo incluir cualquier tipo de argumento.

La documentación explica esto claramente. El método de aplicación acepta una función de python que debería tener un solo parámetro. Si desea pasar más parámetros, debe utilizar functools.partial como sugiere Joel Cornett en su comentario.

Un ejemplo:

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

También puede pasar argumentos de palabras clave utilizando partial .

Otra forma sería crear un lambda:

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

Pero creo que usar partial es mejor.


Tenga en cuenta que las versiones más nuevas de pandas le permiten pasar argumentos adicionales (consulte la nueva documentación ). Así que ahora puedes hacer:

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

Los argumentos posicionales se agregan después del elemento de la serie.

Pasos:

  1. Crear un dataframe
  2. Crear una función
  3. Utilice los argumentos nombrados de la función en la statement de aplicación.

Ejemplo

 x=pd.DataFrame([1,2,3,4]) def add(i1, i2): return i1+i2 x.apply(add,i2=9) 

El resultado de este ejemplo es que cada número en el dataframe se agregará al número 9.

  0 0 10 1 11 2 12 3 13 

Explicación:

La función “agregar” tiene dos parámetros: i1, i2. El primer parámetro será el valor en el dataframe y el segundo es lo que pasemos a la función “aplicar”. En este caso, estamos pasando “9” a la función de aplicación utilizando el argumento de palabra clave “i2”.

 Series.apply(func, convert_dtype=True, args=(), **kwds) args : tuple x = my_series.apply(my_function, args = (arg1,)) 

Puede pasar cualquier número de argumentos a la función que apply ya sea a través de argumentos sin nombre, pasados ​​como una tupla al parámetro args , oa través de otros argumentos de palabras clave capturados internamente como un diccionario por el parámetro kwds .

Por ejemplo, construyamos una función que devuelva Verdadero para valores entre 3 y 6, y Falso de lo contrario.

 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 

Esta función anónima no es muy flexible. Vamos a crear una función normal con dos argumentos para controlar los valores mínimo y máximo que queremos en nuestra Serie.

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

Podemos replicar la salida de la primera función pasando argumentos sin nombre a args :

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

O podemos usar los argumentos nombrados.

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

O incluso una combinación de ambos

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