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

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.