multiple groupby functions examples example columns python pandas dataframe apply pandas-groupby

python - functions - Use Pandas groupby()+apply() con argumentos



pandas groupby count (3)

Alguna confusión aquí sobre por qué usar un parámetro args pandas.DataFrame.apply un error podría deberse al hecho de que pandas.DataFrame.apply tiene un parámetro args (una tupla), mientras que pandas.core.groupby.GroupBy.apply no lo tiene.

Entonces, cuando llama a .apply en un DataFrame, puede usar este argumento; cuando llama a .apply en un objeto groupby, no puede.

En la respuesta de @ MaxU, la expresión lambda x: myFunction(x, arg1) se pasa a func (el primer parámetro); no hay necesidad de especificar *args / **kwargs porque arg1 se especifica en lambda.

Un ejemplo:

import numpy as np import pandas as pd # Called on DataFrame - `args` is a 1-tuple # `0` / `1` are just the axis arguments to np.sum df.apply(np.sum, axis=0) # equiv to df.sum(0) df.apply(np.sum, axis=1) # equiv to df.sum(1) # Called on groupby object of the DataFrame - will throw TypeError print(df.groupby(''col1'').apply(np.sum, args=(0,))) # TypeError: sum() got an unexpected keyword argument ''args''

Me gustaría usar df.groupby() en combinación con apply() para aplicar una función a cada fila por grupo.

Normalmente uso el siguiente código, que generalmente funciona (tenga en cuenta que esto es sin groupby() ):

df.apply(myFunction, args=(arg1,))

Con el groupby() intenté lo siguiente:

df.groupby(''columnName'').apply(myFunction, args=(arg1,))

Sin embargo, me sale el siguiente error:

TypeError: myFunction () obtuvo un argumento de palabra clave inesperado ''args''

Por lo tanto, mi pregunta es: ¿Cómo puedo usar groupby() y apply() con una función que necesita argumentos?


Para mi

df2 = df.groupby(''columnName'').apply(lambda x: my_function(x, arg1, arg2,))

trabajó


pandas.core.groupby.GroupBy.apply NO tiene un parámetro llamado args , pero pandas.DataFrame.apply lo tiene.

Así que prueba esto:

df.groupby(''columnName'').apply(lambda x: myFunction(x, arg1))

o según lo sugerido por @Zero :

df.groupby(''columnName'').apply(myFunction, (''arg1''))

Manifestación:

In [82]: df = pd.DataFrame(np.random.randint(5,size=(5,3)), columns=list(''abc'')) In [83]: df Out[83]: a b c 0 0 3 1 1 0 3 4 2 3 0 4 3 4 2 3 4 3 4 1 In [84]: def f(ser, n): ...: return ser.max() * n ...: In [85]: df.apply(f, args=(10,)) Out[85]: a 40 b 40 c 40 dtype: int64

al usar GroupBy.apply puede pasar cualquiera de los argumentos con nombre:

In [86]: df.groupby(''a'').apply(f, n=10) Out[86]: a b c a 0 0 30 40 3 30 40 40 4 40 20 30

una tupla de argumentos:

In [87]: df.groupby(''a'').apply(f, (10)) Out[87]: a b c a 0 0 30 40 3 30 40 40 4 40 20 30