GroupBy & Agregação
O groupby do pandas implementa split-apply-combine: particiona linhas por chaves, executa uma função por grupo e junta os resultados em um resumo ou frame transformado.
Busque em todas as páginas da documentação
O groupby do pandas implementa split-apply-combine: particiona linhas por chaves, executa uma função por grupo e junta os resultados em um resumo ou frame transformado.
Cartão de referência rápida - pronto para copiar e colar.
import pandas as pd
summary = (
df.groupby("region", observed=True)["revenue"]
.agg(total="sum", avg="mean", n="count")
.reset_index()
)
pivot = pd.pivot_table(df, index="month", columns="region", values="revenue", aggfunc="sum")Quando usar isso:
import pandas as pd
sales = pd.DataFrame(
{
"region": pd.Categorical(["East", "West", "East", "West", "East"]),
"month": ["2025-01", "2025-01", "2025-02", "2025-02", "2025-02"],
"revenue": [120.0, 340.0, 150.0, 280.0, 130.0],
"units": [10, 25, 12, 20, 11],
}
)
# Agregação de múltiplas métricas
by_region = (
sales.groupby("region", observed=True)
.agg(revenue_total=("revenue", "sum"), units_avg=("units", "mean"))
.reset_index()
)
# Compartilhamento por linha do total regional (transform mantém a contagem de linhas)
sales = sales.copy()
sales["share"] = sales.groupby("region", observed=True)["revenue"].transform(
lambda s: s / s.sum()
)
# Pivot para relatórios
pivot = pd.pivot_table(
sales,
index="month",
columns="region",
values="revenue",
aggfunc="sum",
fill_value=0,
observed=True,
)
print(by_region)
print(sales[["region", "revenue", "share"]])
print(pivot)O que isso demonstra:
.agg(col=(field, func))transform para frações de grupo em nível de linhapivot_table com fill_value para meses esparsosobserved=True em chaves categóricassum, mean) ou transformação (rank, fillna).as_index=False (padrão do pandas 2.x em muitas APIs) retorna chaves como colunas.| Método | Linhas de saída | Uso |
|---|---|---|
agg | Uma por grupo | Resumos |
transform | Igual à entrada | Estatísticas de grupo por linha |
apply | Varia | Lógica Python personalizada (mais lenta) |
import pandas as pd
# Múltiplas chaves
df.groupby(["region", "month"], observed=True)["revenue"].sum()
# Filtrar grupos por condição agregada
df.groupby("region").filter(lambda g: g["revenue"].sum() > 500)dropna=False mantém grupos NaN; muitas vezes acidental. Correção: Padrão dropna=True ou limpe as chaves primeiro.observed=True. Correção: passe observed=True no pandas 2.x groupby/pivot.apply retornando formas inconsistentes - quebra a etapa de combine. Correção: prefira agg/transform integrados; vetorize a lógica personalizada.aggfunc. Correção: escolha explicitamente sum, mean ou first..sort_values("revenue_total", ascending=False).| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Polars group_by | Agregações preguiçosas mais rápidas em dados grandes | Pequenos frames onde o pandas já está carregado |
| DuckDB SQL | Junções complexas + agregações em uma única consulta | Resumos simples de uma tabela |
pd.crosstab | Contagens de frequência de dois fatores | Somas de receita numérica |
NumPy bincount | Somas de buckets inteiros em dados 1-D | Múltiplas colunas e tratamento de NA |
df.groupby("region")["customer_id"].nunique()df["rank"] = df.groupby("region")["revenue"].rank(ascending=False)df.groupby("region").agg({"revenue": "sum", "units": "max"})apply do Python por grupo é o culpado usual.agg vetorizado, Polars ou DuckDB para milhões de linhas.out = df.groupby("region").sum().reset_index().agg(total=("revenue", "sum")) nomeia as colunas de saída diretamente..agg(["sum", "mean"]).df.groupby(pd.Grouper(key="date", freq="ME")) para buckets de fim de mês.df.groupby("region")["revenue"].sum().plot(kind="bar")Grouper e resamplegroup_by rápido em escalaVersões da Pilha: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026