Cómo imprimir un objeto groupby

5 minutos de lectura

avatar de usuario
usuario3465658

Quiero imprimir el resultado de agrupar 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 dataframe agrupado?

Si lo hago:

print(df.groupby('A').head())

Obtengo el dataframe 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

  • Estoy obteniendo la salida correcta con print df.groupby('A').head(). ¿Qué versión de pandas tienes?

    – Amit

    27 de marzo de 2014 a las 15:06


  • Acabo de actualizar a 0.13.1 tanto en mi computadora de escritorio como en mi computadora portátil.

    – usuario3465658

    27 de marzo de 2014 a las 15:14

  • ¿Qué tal “listar ()” el ​​objeto directamente? Y luego puede manipularlo/imprimirlo como una estructura de datos normal.

    – Pingüino tropical

    17 de abril de 2018 a las 7:48

  • Por lo que puedo decir, ni una sola respuesta logra producir el resultado deseado. Para este ejemplo específico, lo más cercano que pude encontrar fue df.groupby(['A', 'B']).sum()pero fallaría si ('A', 'B') los pares no son únicos.

    –Eric Duminil

    29 de julio de 2019 a las 11:47

  • Hola. ¿Puedo saber cómo imprimir “uno”, “dos”, “tres” solo en la salida? A lo que me refiero es solo a imprimir los datos que hemos agrupado. Quiero usar estos datos para etiquetar mi gráfico circular.

    – xk derhaka

    12 de noviembre de 2021 a las 3:12

avatar de usuario
Surya

Simplemente haz:

grouped_df = df.groupby('A')

for key, item in grouped_df:
    print(grouped_df.get_group(key), "\n\n")

Aviso de obsolescencia: ix estaba en desuso en 0.20.0

Esto también funciona,

grouped_df = df.groupby('A')    
gb = grouped_df.groups

for key, values in gb.iteritems():
    print(df.ix[values], "\n\n")

Para la agrupación selectiva de claves: Introduce las llaves que quieras dentro del key_list_from_gba continuación, utilizando gb.keys(): Por ejemplo,

gb = grouped_df.groups
gb.keys()

key_list_from_gb = [key1, key2, key3]

for key, values in gb.items():
    if key in key_list_from_gb:
        print(df.ix[values], "\n")

  • Otra opción es: for A in d['A'].unique(): print(A, df.query(f'A == "{A}"'))

    – tommy.carstensen

    24 de mayo de 2017 a las 10:10


  • __iter__() también funciona. Devuelve el Generador que produce una secuencia de (nombre, objeto subdividido) para cada grupo

    – Jeremy Z.

    27 de abril de 2018 a las 5:44

  • ¿Por qué no hacer un bucle? key_list_from_gb ¿aunque?

    – pfnuesel

    11 de septiembre de 2019 a las 5:38

Si simplemente está buscando una forma de mostrarlo, puede usar describe():

grp = df.groupby['colName']
grp.describe()

Esto le da una mesa ordenada.

  • Es una mesa ordenada pero no es la mesa deseada.

    –Eric Duminil

    29 de julio de 2019 a las 10:08

Además de las respuestas anteriores:

Tomando tu ejemplo,

df = pd.DataFrame({'A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6)})

Entonces código simple de 1 línea

df.groupby('A').apply(print)

  • Inteligente, aunque sería mejor .apply(display) para tener un buen formato.

    – set92

    22 de enero de 2021 a las 12:57

  • solo importa display de Ipython.display para eso 🙂

    –Gajraj Singh Chouhan

    3 de junio de 2021 a las 7:35


En Jupyter Notebook, si hace lo siguiente, imprime una buena versión agrupada del objeto. los apply El método ayuda en la creación de un marco de datos multiíndice.

by = 'A'  # groupby 'by' argument
df.groupby(by).apply(lambda a: a[:])

Producción:

             A  B
A                
one   0    one  0
      1    one  1
      5    one  5
three 3  three  3
      4  three  4
two   2    two  2

si quieres el by columna(s) para que no aparezcan en la salida, simplemente suelte la(s) columna(s), así.

df.groupby(by).apply(lambda a: a.drop(by, axis=1)[:])

Producción:

         B
A         
one   0  0
      1  1
      5  5
three 3  3
      4  4
two   2  2

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

Confirmé que el comportamiento de head() cambios entre la versión 0.12 y 0.13. Eso me parece un error. creé un tema.

Pero una operación groupby en realidad no devuelve un DataFrame ordenado por grupo. los .head() El método es un poco engañoso aquí: es solo una característica conveniente que le permite volver a examinar el objeto (en este caso, df) que agrupó. El resultado de groupby es un tipo de objeto separado, un GroupBy objeto. Debes apply, transformo filter para volver a un DataFrame o Serie.

Si todo lo que quería hacer era ordenar por los valores en las columnas A, debería usar df.sort('A').

  • tenga en cuenta que head en realidad está haciendo head(5) ahora está mostrando las primeras 5 filas, más correcto para ‘mostrar’ el marco es df.groupby('A').apply(lambda x: x), que es efectivamente un passthru. Supongo que podrías tener un pass() método, tal vez.

    – Jeff

    27/03/2014 a las 17:30

avatar de usuario
Sumit Pojrel

Otra alternativa sencilla:

for name_of_the_group, group in grouped_dataframe:
   print (name_of_the_group)
   print (group)

  • tenga en cuenta que head en realidad está haciendo head(5) ahora está mostrando las primeras 5 filas, más correcto para ‘mostrar’ el marco es df.groupby('A').apply(lambda x: x), que es efectivamente un passthru. Supongo que podrías tener un pass() método, tal vez.

    – Jeff

    27/03/2014 a las 17:30

avatar de usuario
Surya

Además, otra alternativa sencilla podría ser:

gb = df.groupby("A")
gb.count() # or,
gb.get_group(your_key)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad