pandas groupby resume dados por categoria usando o padrão separar, aplicar e combinar. Você escolhe uma ou mais colunas como chave, aplica soma, média, contagem ou outra operação e recebe uma tabela consolidada. É a ferramenta certa para perguntas como receita por região, ticket médio por canal e pedidos por mês.
Se você ainda está organizando sua base, comece pelo guia de pandas para análise de dados. Um agrupamento confiável depende de tipos corretos, valores ausentes tratados conscientemente e nomes de coluna claros.
Primeiro groupby com soma e média
import pandas as pd
vendas = pd.DataFrame({
"regiao": ["Sul", "Sul", "Norte", "Norte"],
"canal": ["site", "loja", "site", "loja"],
"receita": [1200, 800, 950, 1100],
"pedidos": [12, 5, 10, 7],
})
resumo = (
vendas.groupby("regiao", as_index=False)
.agg(receita_total=("receita", "sum"),
ticket_medio=("receita", "mean"),
pedidos_total=("pedidos", "sum"))
)
A agregação nomeada deixa claro qual coluna entra e qual nome sai. as_index=False mantém regiao como coluna. Sem essa opção, a chave vira índice, o que não é errado, mas pode exigir reset_index() antes de exportar ou combinar dados.
Agrupe por várias colunas
Passe uma lista quando cada combinação formar um grupo:
por_canal = (
vendas.groupby(["regiao", "canal"], as_index=False)
.agg(receita=("receita", "sum"), pedidos=("pedidos", "sum"))
.sort_values("receita", ascending=False)
)
Por padrão, chaves nulas não aparecem no resultado. Use dropna=False quando “sem região” for um grupo que precisa ser auditado. Para preservar a ordem de entrada e evitar uma ordenação desnecessária, avalie sort=False.
agg, transform e filter resolvem problemas diferentes
agg reduz cada grupo. transform retorna um valor para cada linha original, ideal para percentuais e comparações com a média do grupo:
vendas["media_regiao"] = (
vendas.groupby("regiao")["receita"].transform("mean")
)
vendas["participacao"] = (
vendas["receita"]
/ vendas.groupby("regiao")["receita"].transform("sum")
)
filter mantém ou remove grupos inteiros:
regioes_relevantes = vendas.groupby("regiao").filter(
lambda grupo: grupo["pedidos"].sum() >= 15
)
Prefira agregações vetorizadas como "sum", "mean" e "size" a apply com função Python. Elas comunicam melhor a intenção e geralmente executam com mais eficiência. Reserve apply para uma lógica que realmente não cabe nas operações específicas.
Agrupamento por data
Converta a coluna antes de usar pd.Grouper:
vendas["data"] = pd.to_datetime(vendas["data"], errors="raise")
mensal = (
vendas.groupby(pd.Grouper(key="data", freq="MS"))
.agg(receita=("receita", "sum"))
.reset_index()
)
MS cria períodos no início de cada mês. Confira fuso horário e granularidade antes de comparar relatórios.
Erros comuns e validação
Não use count quando deseja contar linhas com valores nulos, pois ele ignora ausentes na coluna. Use size para contar linhas. Confira também se valores numéricos não chegaram como texto. Valide totais antes e depois do agrupamento e ordene explicitamente quando a apresentação depender de ordem.
A documentação oficial do pandas sobre GroupBy, consultada em 28 de julho de 2026, descreve agregação, transformação e filtragem e recomenda operações específicas antes de funções Python personalizadas.