Como criar uma tabela dinâmica com pandas em Python
Uma tabela dinâmica resume dezenas ou milhares de registos numa grelha fácil de ler, cruzando duas dimensões e agregando os valores em cada cruzamento. Em Python, a biblioteca pandas faz exatamente isto com uma única função, pivot_table. Se já usaste tabelas dinâmicas no Excel, vais reconhecer a ideia — só que agora fica em código, reproduzível e fácil de automatizar. É uma das competências mais úteis no dia a dia de quem trabalha com dados.
Pré-requisitos
- Python 3.9 ou superior instalado.
- A biblioteca pandas instalada (
pip install pandas). - Noções básicas de DataFrame: linhas, colunas e tipos de dados.
- Um editor de código ou o Jupyter Notebook para correr os exemplos.
Passo 1: Preparar os dados
Vamos partir de um DataFrame de exemplo com vendas. Cada linha representa uma venda e tem quatro colunas: a região, o produto, o mês e o valor. Num projeto real, estes dados viriam de um ficheiro CSV ou de uma base de dados; para aprender o conceito, basta criá-los à mão.
import pandas as pd
vendas = pd.DataFrame({
"regiao": ["Norte", "Norte", "Sul", "Sul", "Centro", "Norte"],
"produto": ["A", "B", "A", "B", "A", "A"],
"mes": ["Jan", "Jan", "Jan", "Fev", "Fev", "Fev"],
"valor": [100, 150, 90, 200, 120, 130],
})
print(vendas)
Passo 2: Criar a primeira tabela dinâmica
Com os dados prontos, chamamos pivot_table. Há três parâmetros essenciais: index define o que aparece nas linhas, columns define o que aparece nas colunas e values indica a coluna numérica a agregar. Vamos somar as vendas por região (linhas) e por produto (colunas).
tabela = vendas.pivot_table(
values="valor",
index="regiao",
columns="produto",
aggfunc="sum",
)
print(tabela)
O resultado é uma grelha em que cada célula mostra o total de vendas de um produto numa região. Repara como passámos de uma lista comprida de vendas para um resumo com poucas linhas — é esse o poder de uma tabela dinâmica.
Passo 3: Escolher a função de agregação
O parâmetro aggfunc decide como os valores de cada grupo são combinados. Se não o indicares, o pandas calcula a média (mean) por omissão, o que costuma surpreender quem espera uma soma. Podes usar "sum", "mean", "count", "min" ou "max", conforme a pergunta que queres responder.
media = vendas.pivot_table(
values="valor",
index="regiao",
columns="produto",
aggfunc="mean",
)
print(media)
Dica: define sempre o aggfunc de forma explícita. Uma soma responde a "quanto vendemos no total"; uma média responde a "qual o valor típico de cada venda".
Passo 4: Preencher vazios e mostrar totais
Quando uma combinação não existe nos dados — a região Centro não vendeu o produto B — a célula fica com NaN. O parâmetro fill_value=0 substitui esses vazios por zero, tornando a tabela mais legível. Com margins=True, o pandas acrescenta ainda uma linha e uma coluna de totais, que aqui chamamos Total. Assim, vês de imediato o desempenho de cada região e de cada produto.
tabela = vendas.pivot_table(
values="valor",
index="regiao",
columns="produto",
aggfunc="sum",
fill_value=0,
margins=True,
margins_name="Total",
)
print(tabela)
Passo 5: Cruzar por mais do que uma dimensão
Uma tabela dinâmica não está limitada a uma dimensão por eixo. Se passares uma lista ao index, crias níveis hierárquicos: primeiro a região e, dentro de cada região, o mês. Os produtos continuam nas colunas.
detalhe = vendas.pivot_table(
values="valor",
index=["regiao", "mes"],
columns="produto",
aggfunc="sum",
fill_value=0,
)
print(detalhe)
Este formato é excelente para relatórios, porque permite navegar do geral para o detalhe sem escrever ciclos nem consultas complexas.
Verificar o resultado
Corre o script completo. Na tabela do Passo 4 deves ver as três regiões nas linhas, os produtos A e B nas colunas, e uma linha e uma coluna chamadas Total. Para confirmar que está tudo certo, soma a coluna valor do DataFrame original: dá 790. Esse valor tem de coincidir com a célula no canto inferior direito da tabela (o total geral). Se bater certo, a tua tabela dinâmica está correta.
Conclusão
Com poucas linhas de código transformaste dados soltos num resumo pronto a analisar, controlando as linhas, as colunas, a agregação e os totais. A tabela dinâmica é uma ferramenta que vais usar vezes sem conta em relatórios e análises. O próximo passo natural é exportar o resultado com tabela.to_excel("resumo.xlsx") ou criar um gráfico a partir dele. Qual vai ser a primeira dimensão que vais cruzar nos teus próprios dados?