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