rowwise example all python pandas apply

python - example - pandas apply function



pandas pitón: aplicar una función con argumentos a una serie (4)

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

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

La documentation 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 dado que originalmente se preguntó a pandas apply() se ha actualizado para manejar los argumentos posicionales y de palabras clave, el enlace de documentación ahora refleja eso y muestra cómo incluir cualquier tipo de argumento.


La documentación explica esto claramente. El método apply acepta una función python que debe tener un solo parámetro. Si desea pasar más parámetros, debe usar functools.partial como lo 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 palabra clave usando 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 recientes de pandas le permiten pasar argumentos adicionales (consulte la nueva documentación ). Entonces 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.


Puede pasar cualquier cantidad de argumentos a la función que se apply llamando 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 True para valores entre 3 y 6, y False 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ínimos y máximos que queremos en nuestra serie.

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

Podemos replicar el resultado de la primera función pasando argumentos no nombrados 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)


Pasos:

  1. Crear un marco de datos
  2. Crear una función
  3. Use los argumentos nombrados de la función en la declaración de aplicar.

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 marco de datos 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 va a ser el valor en el marco de datos y el segundo es lo que pasamos a la función "aplicar". En este caso, estamos pasando "9" a la función de aplicar usando el argumento de palabra clave "i2".


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