Pandas DataFrame DataFrame.groupby() Función

Suraj Joshi 30 enero 2023
  1. La sintaxis de pandas.DataFrame.groupby():
  2. Códigos de ejemplo: Agrupa dos DataFrames con pandas.DataFrame.groupby() basado en valores de una sola columna
  3. Códigos de ejemplo: Agrupar dos DataFrames con pandas.DataFrame.groupby() basado en múltiples condiciones
  4. Códigos de ejemplo: Ponga as_index=False en pandas.DataFrame.groupby()
Pandas DataFrame DataFrame.groupby() Función

pandas.DataFrame.groupby() divide el DataFrame en grupos basados en el criterio dado. Podemos manipular fácilmente grandes conjuntos de datos usando el método groupby().

La sintaxis de pandas.DataFrame.groupby():

DataFrame.groupby(
    by=None,
    axis=0,
    level=None,
    as_index=True,
    sort=True,
    group_keys=True,
    squeeze: bool=False,
    observed: bool=False)

Parámetros

by mapeo, función, cadena, label o iterable para agrupar elementos
axis agruparse junto con la fila (axis=0) o la fila (axis=1)
level Entero. valor para agrupar por un nivel o niveles particulares
as_index Booleana. Devuelve un objeto con etiquetas de grupo como índice
sort Booleana. Ordena las claves de grupo
group_keys Booleana. Añade claves de grupo a los índices para identificar las piezas
squeeze Booleana. Disminuye la dimensión del retorno cuando es posible
observed Booleana. Sólo se aplica si alguno de los meros es categórico y sólo muestra valores observados para meros categóricos si se establece en True.

Retorna

Devuelve un objeto DataFrameGroupBy que contiene la información agrupada.

Códigos de ejemplo: Agrupa dos DataFrames con pandas.DataFrame.groupby() basado en valores de una sola columna

import pandas as pd
fruit_list = [ ('Orange', 34, 'Yes' ) ,
             ('Mango', 24, 'No' ) ,
             ('banana', 14, 'No' ) ,
             ('Apple', 44, 'Yes' ) ,
             ('Pineapple', 64, 'No') ,
             ('Kiwi', 84, 'Yes')  ]

df = pd.DataFrame(fruit_list, columns = ['Name' , 'Price', 'In_Stock']) 
grouped_df = df.groupby('In_Stock')
print(grouped_df)
print(type(grouped_df))

Resultado:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f73cc992d30>
<class 'pandas.core.groupby.generic.DataFrameGroupBy'>

Agrupa el DataFrame en grupos basados en los valores de la columna In_Stock y devuelve un DataFrameGroupBy.

Para obtener detalles sobre el objeto DataFrameGroupBy devuelto por groupby(), podemos usar el método first() del objeto DataFrameGroupBy para obtener el primer elemento de cada grupo.

import pandas as pd
fruit_list = [ ('Orange', 34, 'Yes' ) ,
             ('Mango', 24, 'No' ) ,
             ('banana', 14, 'No' ) ,
             ('Apple', 44, 'Yes' ) ,
             ('Pineapple', 64, 'No') ,
             ('Kiwi', 84, 'Yes')  ]

df = pd.DataFrame(fruit_list, columns = ['Name' , 'Price', 'In_Stock']) 
grouped_df = df.groupby('In_Stock')
print(grouped_df.first())

Resultado:

            Name  Price
In_Stock               
No         Mango     24
Yes       Orange     34

Imprime el DataFrame formado por los primeros elementos de ambos grupos separados de df.

También podemos imprimir el grupo entero usando el método get_group().

import pandas as pd
fruit_list = [ ('Orange', 34, 'Yes' ) ,
             ('Mango', 24, 'No' ) ,
             ('banana', 14, 'No' ) ,
             ('Apple', 44, 'Yes' ) ,
             ('Pineapple', 64, 'No') ,
             ('Kiwi', 84, 'Yes')  ]

df = pd.DataFrame(fruit_list, columns = ['Name' , 'Price', 'In_Stock']) 
grouped_df = df.groupby('In_Stock')
print(grouped_df.get_group('Yes'))

Resultado:

     Name  Price In_Stock
0  Orange     34      Yes
3   Apple     44      Yes
5    Kiwi     84      Yes

Imprime todos los elementos en df cuyo valor en la columna In_Stock es Yes. Primero agrupamos los elementos con diferentes valores de la columna In_Stock en grupos separados usando el método groubpy() y luego accedemos a un grupo particular usando el método get_group().

Códigos de ejemplo: Agrupar dos DataFrames con pandas.DataFrame.groupby() basado en múltiples condiciones

import pandas as pd
fruit_list = [ ('Orange', 34, 'Yes' ,'ABC') ,
             ('Mango', 24, 'No','ABC' ) ,
             ('banana', 14, 'No','ABC' ) ,
             ('Apple', 44, 'Yes',"XYZ" ) ,
             ('Pineapple', 64, 'No',"XYZ") ,
             ('Kiwi', 84, 'Yes',"XYZ")  ]

df = pd.DataFrame(fruit_list, columns = ['Name' , 'Price', 'In_Stock',"Supplier"]) 
grouped_df = df.groupby(['In_Stock', 'Supplier']) 
  
print(grouped_df.first())

Resultado:

                        Name  Price
In_Stock Supplier                  
No       ABC           Mango     24
         XYZ       Pineapple     64
Yes      ABC          Orange     34
         XYZ           Apple     44

Agrupa el df en grupos basados en sus valores en las columnas In_Stock y Supplier y devuelve un DatosFrameGroupBy.

Usamos el método first() para obtener el primer elemento de cada grupo. Devuelve un DataFrame formado por la combinación de los primeros elementos de los cuatro grupos siguientes:

  • Grupo con los valores de la columna In_Stock No y la columna Supplier ABC.
  • Grupo con valores de la columna In_Stock No y la columna Supplier XYZ.
  • Agrupa los valores de la columna In_Stock Yes y la columna Supplier ABC.
  • Agrupa los valores de la columna In_Stock Yes y la columna Supplier XYZ.

El DataFrame devuelto por los métodos del objeto GroupBy tiene un MultiIndex, cuando le pasamos varias etiquetas a la función groupby().

print(grouped_df.first().index)

Resultado:

MultiIndex(levels=[['No', 'Yes'], ['ABC', 'XYZ']],
           labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
           names=['In_Stock', 'Supplier'])

Códigos de ejemplo: Ponga as_index=False en pandas.DataFrame.groupby()

El parámetro as_index en el método DataFrame.groupby() es True por defecto. La etiqueta de grupo es el índice del DataFrame devuelto cuando se aplican los métodos GroupBy como first().

import pandas as pd

fruit_list = [
    ("Orange", 34, "Yes"),
    ("Mango", 24, "No"),
    ("banana", 14, "No"),
    ("Apple", 44, "Yes"),
    ("Pineapple", 64, "No"),
    ("Kiwi", 84, "Yes"),
]

df = pd.DataFrame(fruit_list, columns=["Name", "Price", "In_Stock"])

grouped_df = df.groupby("In_Stock", as_index=True)

firtGroup = grouped_df.first()
print(firtGroup)
print(firtGroup.index)

print("---------")

grouped_df = df.groupby("In_Stock", as_index=False)

firtGroup = grouped_df.first()
print(firtGroup)
print(firtGroup.index)

Resultado:

            Name  Price
In_Stock               
No         Mango     24
Yes       Orange     34
Index(['No', 'Yes'], dtype='object', name='In_Stock')
---------
  In_Stock    Name  Price
0       No   Mango     24
1      Yes  Orange     34
Int64Index([0, 1], dtype='int64')

Como puedes ver, el índice del DataFrame generado es la etiqueta de grupo debido a as_index=True por defecto.

El índice se convierte en un índice generado automáticamente en números cuando establecemos as_index=False.

Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

Artículo relacionado - Pandas DataFrame