Pandas DataFrame DataFrame.groupby() Função

Suraj Joshi 30 janeiro 2023
  1. Sintaxe de pandas.DataFrame.groupby():
  2. Códigos de exemplo: Grupo dois DataFrames com pandas.DataFrame.groupby() com base em valores de coluna única
  3. Códigos de exemplo: Group Two DataFrames With pandas.DataFrame.groupby() Based on Multiple Conditions
  4. Códigos de exemplo: Definir as_index=False em pandas.DataFrame.groupby()
Pandas DataFrame DataFrame.groupby() Função

A função pandas.DataFrame.groupby() divide o DataFrame em grupos com base em alguns critérios. Podemos facilmente manipular grandes conjuntos de dados utilizando o método grupo-por().

Sintaxe 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 mapeamento, função, string, label ou iterável para agrupar elementos
axis agrupar junto com a linha (axis=0) ou coluna (axis=1)
level Valor inteiro para agrupar por um determinado nível ou níveis
as_index Booleano. Ele retorna um objeto com etiquetas de grupo como o índice
sort Booleano. Classifica as chaves do grupo
group_keys Booleano. Adiciona chaves de grupo para indexar para identificar as peças
squeeze Booleano. Diminui a dimensão do retorno quando possível
observed Booleano. Aplicar somente se qualquer uma das garoupas for categórica e só mostrar valores observados para as garoupas categóricas se estiver definida como True.

Retornar

Ele retorna um objeto DataFrameGroupBy que contém as informações agrupadas.

Códigos de exemplo: Grupo dois DataFrames com pandas.DataFrame.groupby() com base em valores de coluna única

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'>

Ela agrupa o DataFrame em grupos baseados nos valores da coluna In_Stock e retorna um objeto DataFrameGroupBy.

Para obter detalhes sobre o objeto DataFrameGroupBy retornado por groupby(), podemos utilizar o método first() do objeto DataFrameGroupBy para obter o primeiro 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 o DataFrame formado pelos primeiros elementos de ambos os grupos divididos por df.

Também podemos imprimir o grupo inteiro utilizando o 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 os elementos no df cujo valor na coluna In_Stock é Yes. Primeiro agrupamos elementos com valores diferentes da coluna In_Stock em grupos separados utilizando o método groubpy() e depois acessamos um grupo particular utilizando o método get_group().

Códigos de exemplo: Group Two DataFrames With pandas.DataFrame.groupby() Based on Multiple Conditions

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

Ela agrupa o df em grupos baseados em seus valores nas colunas In_Stock e Supplier e retorna um objeto DataFrameGroupBy.

Utilizamos o método first() para obter o primeiro elemento de cada grupo. Ele retorna um DataFrameFrame formado pela combinação dos primeiros elementos dos quatro grupos seguintes:

  • Grupo com valores da coluna In_Stock No e Supplier coluna ABC.
  • Grupo com valores da coluna In_Stock No e da coluna Supplier XYZ.
  • Grupo com valores da coluna In_Stock Yes e coluna Supplier coluna ABC.
  • Grupo com valores da coluna In_Stock Yes e coluna Supplier XYZ.

O DataFrame retornado pelos métodos do objeto GroupBy tem um MultiIndex, quando passamos múltiplos rótulos para a função 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 exemplo: Definir as_index=False em pandas.DataFrame.groupby()

O parâmetro as_index em DataFrame.groupby() método é True por padrão. A etiqueta do grupo é o índice do DataFrame retornado ao aplicar 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 você pode ver, o índice do DataFrame gerado é a etiqueta do grupo por causa de as_index=True por padrão.

O índice torna-se índice gerado automaticamente em números quando definimos as_index=False.

Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn

Artigo relacionado - Pandas DataFrame