Quiero imprimir el resultado de la agrupación con Pandas.
Tengo un marco de datos:
import pandas as pd
df = pd.DataFrame({'A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6)})
print(df)
A B
0 one 0
1 one 1
2 two 2
3 three 3
4 three 4
5 one 5
Al imprimir después de agrupar por 'A' tengo lo siguiente:
print(df.groupby('A'))
<pandas.core.groupby.DataFrameGroupBy object at 0x05416E90>
¿Cómo puedo imprimir el marco de datos agrupado?
Si lo hago:
print(df.groupby('A').head())
Obtengo el marco de datos como si no estuviera agrupado:
A B
A
one 0 one 0
1 one 1
two 2 two 2
three 3 three 3
4 three 4
one 5 one 5
Estaba esperando algo como:
A B
A
one 0 one 0
1 one 1
5 one 5
two 2 two 2
three 3 three 3
4 three 4
print df.groupby('A').head()
. ¿Qué versión de pandas tienes?df.groupby(['A', 'B']).sum()
, pero fallaría si los('A', 'B')
pares no son únicos.Respuestas:
Simplemente haz:
Esto también funciona
Para la agrupación selectiva de claves: inserte las claves que desee dentro de las
key_list_from_gb
siguientes, utilizandogb.keys()
: Por ejemplofuente
for A in d['A'].unique(): print(A, df.query(f'A == "{A}"'))
key_list_from_gb
?Si simplemente está buscando una forma de mostrarlo, puede usar describe ():
Esto te da una mesa ordenada.
fuente
Confirmé que el comportamiento de los
head()
cambios entre la versión 0.12 y 0.13. Eso me parece un error. Creé un problema .Pero una operación groupby en realidad no devuelve un DataFrame ordenado por grupo. El
.head()
método es un poco engañoso aquí: es solo una característica conveniente que le permite volver a examinar el objeto (en este casodf
) que agrupó. El resultado degroupby
es un tipo de objeto separado, unGroupBy
objeto. Debeapply
,transform
ofilter
para volver a un DataFrame o Series.Si todo lo que quería hacer era ordenar por los valores en las columnas A, debería usar
df.sort('A')
.fuente
head
realidad está haciendohead(5)
iow, está mostrando las primeras 5 filas, más correcto para 'mostrar' el marcodf.groupby('A').apply(lambda x: x)
, que es efectivamente un passthru. Supongo que podrías tener unpass()
método, tal vez.Otra alternativa simple:
fuente
Además, otra alternativa simple podría ser:
fuente
Además de las respuestas anteriores:
Tomando tu ejemplo,
Luego simple código de 1 línea
fuente
Gracias a Surya por sus buenas ideas. Limpiaría su solución y simplemente haría:
fuente
Lista de llamadas () en el objeto GroupBy
te dio:
fuente
no puede ver los datos groupBy directamente mediante la declaración de impresión, pero puede ver iterando sobre el grupo usando for loop intente este código para ver el grupo por datos
obtendrá un resultado después de intentar esto como un grupo por resultado
Espero que ayude
fuente
En Jupyter Notebook, si hace lo siguiente, imprime una buena versión agrupada del objeto. El
apply
método ayuda en la creación de un marco de datos de múltiples índices.Salida:
Si desea que las
by
columnas no aparezcan en la salida, simplemente suelte las columnas, así.Salida:
Aquí, no estoy seguro de por qué
.iloc[:]
no funciona en lugar de[:]
al final. Entonces, si hay algunos problemas en el futuro debido a actualizaciones (o en la actualidad),.iloc[:len(a)]
también funciona.fuente
Encontré una forma complicada, solo para una lluvia de ideas, vea el código:
La salida:
Los pros son tan fáciles de imprimir, ya que devuelve un marco de datos, en lugar de Groupby Object. Y la salida se ve bien. Si bien la desventaja es que crea una serie de datos redundantes.
fuente
En python 3
De manera más interactiva
fuente
para imprimir todas (o arbitrariamente muchas) líneas del df agrupado:
fuente