python - example - pandas groupby count
devolver el marco de datos agregado de pandas groupby (1)
La razón por la que está viendo las columnas con 0 es porque la salida de .unique()
es una matriz .
La mejor manera de entender cómo va a funcionar su aplicación es inspeccionar cada acción en grupo:
In [11] :g = df.groupby(''col1'')
In [12]: g.get_group(''A'')
Out[12]:
col1 col2
0 A 1
1 A 2
In [13]: g.get_group(''A'')[''col1''].unique()
Out[13]: array([A], dtype=object)
In [14]: sum(g.get_group(''A'')[''col2''])
Out[14]: 3.0
La mayoría de las veces quiere que este sea un valor agregado.
La salida de grouped.apply
siempre tendrá las etiquetas de grupo como un índice (los valores únicos de ''col1''), por lo que su construcción de ejemplo de col1
parece un poco obtusa.
Nota: para ''col1''
(el índice) en una columna, puede llamar a reset_index
, entonces en este caso.
In [15]: g.sum().reset_index()
Out[15]:
col1 col2
0 A 3
1 B 7
Estoy tratando de entender bien el método de grupo de Pandas. Me gustaría escribir una función que realice algunas funciones de agregación y luego devuelva un Pandas DataFrame. Aquí hay un ejemplo extremadamente simplificado usando sum (). Sé que hay formas más sencillas de hacer sumas simples, en la vida real mi función es más compleja:
import pandas as pd
df = pd.DataFrame({''col1'': [''A'', ''A'', ''B'', ''B''], ''col2'':[1.0, 2, 3, 4]})
In [3]: df
Out[3]:
col1 col2
0 A 1
1 A 2
2 B 3
3 B 4
def func2(df):
dfout = pd.DataFrame({ ''col1'' : df[''col1''].unique() ,
''someData'': sum(df[''col2'']) })
return dfout
t = df.groupby(''col1'').apply(func2)
In [6]: t
Out[6]:
col1 someData
col1
A 0 A 3
B 0 B 7
No esperaba tener col1
allí dos veces ni esperaba ese índice misterioso. Realmente pensé que obtendría col1
y someData
.
En mi aplicación de la vida real, estoy agrupando por más de una columna y realmente me gustaría obtener un DataFrame y no un objeto de la serie.
¿Alguna idea para una solución o una explicación sobre lo que está haciendo Pandas en mi ejemplo anterior?
----- información agregada -----
Debería haber empezado con este ejemplo, creo:
In [13]: import pandas as pd
In [14]: df = pd.DataFrame({''col1'':[''A'',''A'',''A'',''B'',''B'',''B''], ''col2'':[''C'',''D'',''D'',''D'',''C'',''C''], ''col3'':[.1,.2,.4,.6,.8,1]})
In [15]: df
Out[15]:
col1 col2 col3
0 A C 0.1
1 A D 0.2
2 A D 0.4
3 B D 0.6
4 B C 0.8
5 B C 1.0
In [16]: def func3(df):
....: dfout = sum(df[''col3'']**2)
....: return dfout
....:
In [17]: t = df.groupby([''col1'', ''col2'']).apply(func3)
In [18]: t
Out[18]:
col1 col2
A C 0.01
D 0.20
B C 1.64
D 0.36
En la ilustración anterior, el resultado de la función apply()
es una serie de pandas. Y carece del grupo por columnas de df.groupby
. La esencia de lo que estoy luchando es ¿cómo creo una función que aplico a un grupo por el que se devuelve tanto el resultado de la función como las columnas en las que se ha agrupado?
----- otra actualización ------
Parece que si hago esto:
pd.DataFrame(t).reset_index()
Obtengo un marco de datos que está muy cerca de lo que estaba buscando.