Se você já usou Tabela Dinâmica no Excel, o conceito de groupby no Pandas vai ser imediato. É a mesma ideia: agrupar linhas por uma categoria e calcular algo sobre elas. A diferença é que com Pandas você faz isso programaticamente, de forma reproduzível e com qualquer volume de dados.
Sintaxe básica do groupby
A estrutura básica é df.groupby('coluna')['coluna_valor'].func():
import pandas as pd
# Carrega os dados
df = pd.read_csv('vendas.csv')
# Total de vendas por região
total_por_regiao = df.groupby('Regiao')['Valor'].sum()
print(total_por_regiao)
# Regiao
# Centro-Oeste 182500.0
# Nordeste 143200.0
# Sul 298700.0
# type: float64
Funções de agregação disponíveis
.sum()— soma.mean()— média.count()— contagem de valores não nulos.size()— contagem de linhas (incluindo nulos).min()/.max()— mínimo e máximo.std()— desvio padrão.nunique()— contagem de valores únicos
Agrupando por várias colunas
Passe uma lista para agrupar por mais de uma categoria:
# Total de vendas por região E por produto
resultado = df.groupby(['Regiao', 'Produto'])['Valor'].sum()
print(resultado.reset_index())
Calculando múltiplas métricas com agg()
O método agg() permite calcular várias métricas de uma vez:
resumo = df.groupby('Regiao')['Valor'].agg(
total='sum',
media='mean',
pedidos='count',
ticket_max='max'
).reset_index()
print(resumo)
reset_index(): transformando de volta em DataFrame
Após um groupby, o resultado é uma Série ou DataFrame com índice hierárquico. Use .reset_index() para transformar os índices em colunas normais — o que facilita salvar em Excel ou continuar manipulando os dados.
Combinando groupby com filtros
# Vendas por região apenas do produto "Notebook"
df_notebook = df[df['Produto'] == 'Notebook']
vendas_notebook = df_notebook.groupby('Regiao')['Valor'].sum().reset_index()
A ordem importa: filtre primeiro, depois agrupe. Isso é mais eficiente do que agrupar tudo e filtrar depois.
Perguntas frequentes
Qual a diferença entre count() e size()?
count() conta valores não nulos em uma coluna específica. size() conta o total de linhas no grupo, incluindo nulos. Para contar pedidos, prefira size() se a coluna de referência pode ter valores vazios.
Como fazer groupby com uma função personalizada?
Use agg() com uma função lambda: df.groupby('Regiao')['Valor'].agg(lambda x: x.quantile(0.9)) calcula o percentil 90 de Valor por Região.