Como agrupar dados com groupby em pandas: passo a passo
Agrupar dados com o groupby do pandas é uma das tarefas mais úteis em Python para análise de dados: resume milhares de linhas em resultados por categoria e responde a perguntas como "qual é a receita por região?" ou "quantas vendas houve por produto?". Em vez de filtrar manualmente categoria a categoria, o groupby faz esse trabalho de uma só vez, com código curto e legível. A seguir tens um exemplo prático, do caso mais simples ao resumo completo, para dominares o groupby e a agregação de dados.
Pré-requisitos
- Python 3 instalado no teu computador.
- A biblioteca pandas instalada (
pip install pandas). - Noções básicas de DataFrames: uma tabela com linhas e colunas.
Passo 1: Preparar os dados de exemplo
Para veres o groupby a funcionar sem depender de ficheiros externos, começamos por criar um DataFrame pequeno com vendas. Cada linha é uma venda e tem quatro colunas: a region (região), o product (produto), as units (unidades vendidas) e a revenue (receita).
import pandas as pd
sales = pd.DataFrame({
"region": ["North", "North", "South", "South", "Center", "North"],
"product": ["A", "B", "A", "B", "A", "A"],
"units": [10, 5, 8, 12, 7, 3],
"revenue": [100, 75, 80, 180, 70, 30],
})
Passo 2: Agrupar por uma coluna e somar
O padrão do groupby chama-se "dividir, aplicar, combinar" (split-apply-combine): o pandas divide as linhas por cada valor da coluna indicada, aplica uma função a cada grupo (aqui, a soma) e combina os resultados numa única estrutura. Para obter a receita por região, agrupamos por region, escolhemos a coluna revenue e aplicamos sum():
revenue_by_region = sales.groupby("region")["revenue"].sum()
print(revenue_by_region)
O resultado é uma Series em que o índice passa a ser a região: Center soma 70, North soma 205 e South soma 260. Repara que a coluna pela qual agrupámos deixa de ser uma coluna normal e passa a ser o índice do resultado.
Passo 3: Aplicar várias agregações com agg()
Na prática queremos quase sempre mais do que uma métrica. Com o método agg() e a chamada named aggregation damos um nome a cada resultado e indicamos, para cada um, a coluna e a função a aplicar. Assim obtemos várias colunas de resumo de uma só vez, já com nomes claros:
summary = sales.groupby("region").agg(
total_revenue=("revenue", "sum"),
avg_units=("units", "mean"),
n_sales=("revenue", "count"),
)
print(summary)
Cada linha do resultado é uma região e cada coluna é uma métrica: a soma da receita, a média de unidades (mean) e o número de vendas (count). Outras funções muito usadas são min, max, median, std e nunique (valores distintos).
Passo 4: Agrupar por várias colunas
Podemos agrupar por mais do que uma coluna passando uma lista ao groupby. Para obter a receita por região e por produto, agrupamos por ambas:
by_region_product = (
sales.groupby(["region", "product"])["revenue"].sum().reset_index()
)
print(by_region_product)
Agora o resultado tem uma linha por cada combinação de região e produto. Ao agrupar por várias colunas, o pandas cria um índice composto (MultiIndex); o reset_index() transforma esse índice em colunas normais e devolve um DataFrame limpo, pronto a usar num gráfico ou a exportar para um ficheiro.
Verificar o resultado
Uma forma simples de confirmar que o agrupamento está correto é comparar a soma de todos os grupos com a soma da coluna original. Se os dois valores forem diferentes, algo correu mal — por exemplo, valores em falta (NaN) que não foram contabilizados:
print(revenue_by_region.sum()) # 535
print(sales["revenue"].sum()) # 535
Os dois valores coincidem (535), por isso o groupby não perdeu nem duplicou linhas. Para leres o resultado mais depressa, podes ordená-lo com revenue_by_region.sort_values(ascending=False) e ver primeiro as regiões com maior receita.
Conclusão
Com o groupby passaste de uma tabela de linhas soltas para respostas claras por categoria — a base de quase toda a análise de dados em pandas. A partir daqui, dois próximos passos naturais são combinar o groupby com merge para cruzar informação de várias tabelas e criar uma tabela dinâmica com pivot_table. Qual vai ser a primeira pergunta que vais responder aos teus dados com um groupby?