(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como criar uma tabela dinâmica com pandas em Python

João Barros 04 de July de 2026 4 min de leitura

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?