O Pandas é a biblioteca mais poderosa e popular do Python para análise de dados. Com ela, você consegue carregar planilhas, limpar dados bagunçados, fazer cálculos complexos e gerar insights incríveis — tudo em poucas linhas de código.
Neste guia completo, você vai dominar o Pandas do zero ao avançado.
📦 Instalação e Importação
# Instalar
pip install pandas numpy
# Importar (convenção padrão da comunidade)
import pandas as pd
import numpy as np
print(pd.__version__)
🧱 As Duas Estruturas Principais
Series — Uma coluna de dados
import pandas as pd
# Criar uma Series
notas = pd.Series([8.5, 7.0, 9.2, 6.8, 10.0],
index=["Ana", "Bruno", "Carlos", "Diana", "Eva"])
print(notas)
# Ana 8.5
# Bruno 7.0
# Carlos 9.2
# Diana 6.8
# Eva 10.0
# Acessar valor
print(notas["Ana"]) # 8.5
print(notas.mean()) # 8.3 - média
print(notas.max()) # 10.0 - máximo
print(notas.min()) # 6.8 - mínimo
DataFrame — Uma tabela completa
import pandas as pd
# Criar DataFrame a partir de dicionário
dados = {
"nome": ["Ana", "Bruno", "Carlos", "Diana", "Eva"],
"idade": [25, 30, 22, 28, 35],
"salario": [5000, 8000, 4500, 7200, 9500],
"area": ["TI", "TI", "Marketing", "TI", "RH"],
"aprovado": [True, True, False, True, True]
}
df = pd.DataFrame(dados)
print(df)
📂 Carregando Dados de Arquivos
import pandas as pd
# CSV
df_csv = pd.read_csv("dados.csv")
df_csv = pd.read_csv("dados.csv", sep=";", encoding="utf-8")
# Excel
df_excel = pd.read_excel("relatorio.xlsx", sheet_name="Plan1")
# JSON
df_json = pd.read_json("dados.json")
# SQL (com SQLAlchemy)
# df_sql = pd.read_sql("SELECT * FROM clientes", conn)
# Ver as primeiras/últimas linhas
print(df_csv.head()) # primeiras 5 linhas
print(df_csv.tail(3)) # últimas 3 linhas
print(df_csv.shape) # (linhas, colunas)
🔍 Explorando o DataFrame
import pandas as pd
df = pd.read_csv("vendas.csv")
# Informações gerais
print(df.info()) # tipos de dado de cada coluna
print(df.describe()) # estatísticas: média, std, min, max...
print(df.shape) # (número de linhas, número de colunas)
print(df.columns) # nomes das colunas
print(df.dtypes) # tipo de cada coluna
# Verificar valores ausentes
print(df.isnull().sum())
print(df.isnull().mean() * 100) # % de nulos por coluna
🎯 Selecionando Dados
Selecionando Colunas
# Uma coluna → retorna Series
nomes = df["nome"]
# Múltiplas colunas → retorna DataFrame
perfil = df[["nome", "idade", "salario"]]
# Nova coluna calculada
df["bonus"] = df["salario"] * 0.10
Selecionando Linhas com loc e iloc
# loc → por rótulo (label)
primeira_linha = df.loc[0]
algumas_linhas = df.loc[0:4, ["nome", "salario"]]
# iloc → por posição (index)
primeira = df.iloc[0] # linha 0
primeiras5 = df.iloc[:5] # primeiras 5
celula = df.iloc[2, 1] # linha 2, coluna 1
Filtrando com Condições
# Filtro simples
ti = df[df["area"] == "TI"]
# Filtro com múltiplas condições
senior_ti = df[(df["area"] == "TI") & (df["idade"] > 28)]
# Filtro com OR
ti_ou_rh = df[(df["area"] == "TI") | (df["area"] == "RH")]
# Filtro com isin
areas_tecnicas = df[df["area"].isin(["TI", "Engenharia"])]
# Filtro com string (contém)
dev = df[df["cargo"].str.contains("Dev", case=False, na=False)]
🧹 Limpeza de Dados
Tratando Valores Ausentes (NaN)
import pandas as pd
import numpy as np
df = pd.read_csv("dados_sujos.csv")
# Remover linhas com qualquer NaN
df_limpo = df.dropna()
# Remover apenas se todas as colunas forem NaN
df_parcial = df.dropna(how='all')
# Remover se coluna específica for NaN
df_filtrado = df.dropna(subset=["email"])
# Preencher NaN com valores fixos
df["salario"] = df["salario"].fillna(0)
df["cidade"] = df["cidade"].fillna("Não informado")
# Preencher com média/mediana
df["salario"] = df["salario"].fillna(df["salario"].mean())
df["salario"] = df["salario"].fillna(df["salario"].median())
# Preencher com próximo/anterior valor válido
df["preco"] = df["preco"].fillna(method='ffill') # forward fill
df["preco"] = df["preco"].fillna(method='bfill') # backward fill
Removendo Duplicatas
# Verificar duplicatas
print(df.duplicated().sum())
# Remover duplicatas (mantém primeira ocorrência)
df = df.drop_duplicates()
# Remover duplicatas apenas em colunas específicas
df = df.drop_duplicates(subset=["cpf", "email"])
Convertendo Tipos de Dados
# String → número
df["salario"] = df["salario"].str.replace("R$ ", "").str.replace(",", ".").astype(float)
# String → data
df["data_nascimento"] = pd.to_datetime(df["data_nascimento"], format="%d/%m/%Y")
# Número → categoria (economia de memória)
df["area"] = df["area"].astype("category")
# Verificar tipos
print(df.dtypes)
🔄 Transformando Dados
Renomeando e Reorganizando
# Renomear colunas
df = df.rename(columns={
"nm_funcionario": "nome",
"vl_salario": "salario",
"dt_admissao": "data_admissao"
})
# Deixar colunas em minúsculo
df.columns = df.columns.str.lower().str.strip()
# Reordenar colunas
df = df[["nome", "cpf", "area", "salario", "data_admissao"]]
# Resetar índice
df = df.reset_index(drop=True)
Aplicando Funções com apply()
# Função simples
df["nome_upper"] = df["nome"].apply(str.upper)
# Função lambda
df["salario_liquido"] = df["salario"].apply(lambda x: x * 0.85)
# Função própria
def classificar_salario(valor):
if valor < 3000:
return "Junior"
elif valor < 8000:
return "Pleno"
else:
return "Senior"
df["nivel"] = df["salario"].apply(classificar_salario)
# Aplicar em múltiplas colunas
df["resumo"] = df.apply(lambda row: f"{row['nome']} ({row['area']})", axis=1)
📊 Agrupamento e Agregação
import pandas as pd
df = pd.read_csv("funcionarios.csv")
# Agrupar por área e calcular média de salário
media_por_area = df.groupby("area")["salario"].mean()
# Múltiplas agregações
resumo = df.groupby("area").agg(
total_funcionarios=("nome", "count"),
salario_medio=("salario", "mean"),
salario_maximo=("salario", "max"),
salario_minimo=("salario", "min")
)
# groupby com múltiplas colunas
por_area_nivel = df.groupby(["area", "nivel"])["salario"].mean()
# Ordenar resultado
resumo = resumo.sort_values("salario_medio", ascending=False)
print(resumo)
🔗 Combinando DataFrames
merge() — como um JOIN do SQL
import pandas as pd
funcionarios = pd.DataFrame({
"id": [1, 2, 3, 4],
"nome": ["Ana", "Bruno", "Carlos", "Diana"],
"dept_id": [10, 20, 10, 30]
})
departamentos = pd.DataFrame({
"id": [10, 20, 30],
"nome_dept": ["TI", "Marketing", "RH"]
})
# INNER JOIN (padrão)
resultado = pd.merge(funcionarios, departamentos,
left_on="dept_id", right_on="id",
suffixes=("_func", "_dept"))
# LEFT JOIN
left = pd.merge(funcionarios, departamentos,
left_on="dept_id", right_on="id",
how="left")
print(resultado[["nome", "nome_dept"]])
concat() — empilhando DataFrames
# Empilhar verticalmente (mesmo formato)
janeiro = pd.read_csv("jan.csv")
fevereiro = pd.read_csv("fev.csv")
marco = pd.read_csv("mar.csv")
trimestre = pd.concat([janeiro, fevereiro, marco], ignore_index=True)
# Unir horizontalmente (por coluna)
df_completo = pd.concat([df_a, df_b], axis=1)
📅 Trabalhando com Datas
import pandas as pd
df = pd.read_csv("pedidos.csv")
df["data_pedido"] = pd.to_datetime(df["data_pedido"])
# Extrair partes da data
df["ano"] = df["data_pedido"].dt.year
df["mes"] = df["data_pedido"].dt.month
df["dia"] = df["data_pedido"].dt.day
df["semana"] = df["data_pedido"].dt.isocalendar().week
# Diferença entre datas
df["dias_entrega"] = (df["data_entrega"] - df["data_pedido"]).dt.days
# Filtrar por período
jan_2026 = df[(df["data_pedido"] >= "2026-01-01") &
(df["data_pedido"] <= "2026-01-31")]
# Agrupar por mês
vendas_mensais = df.groupby(df["data_pedido"].dt.to_period("M"))["valor"].sum()
💾 Salvando os Dados
import pandas as pd
df = pd.read_csv("dados_brutos.csv")
# ... processamento ...
# Salvar como CSV
df.to_csv("dados_limpos.csv", index=False, encoding="utf-8")
# Salvar como Excel
df.to_excel("relatorio.xlsx", sheet_name="Dados", index=False)
# Salvar como JSON
df.to_json("dados.json", orient="records", force_ascii=False)
# Múltiplas abas no Excel
with pd.ExcelWriter("relatorio_completo.xlsx") as writer:
df.to_excel(writer, sheet_name="Dados", index=False)
resumo.to_excel(writer, sheet_name="Resumo", index=False)
🎓 Projeto Prático: Análise de Vendas
import pandas as pd
import numpy as np
# ──────────────────────────────────────────
# 1. CARREGAR OS DADOS
# ──────────────────────────────────────────
print("📂 Carregando dados...")
df = pd.read_csv("vendas.csv", parse_dates=["data"])
print(f"Shape: {df.shape}")
print(df.dtypes)
# ──────────────────────────────────────────
# 2. LIMPEZA
# ──────────────────────────────────────────
print("\n🧹 Limpando dados...")
# Remover duplicatas
df = df.drop_duplicates()
# Tratar nulos
df["desconto"] = df["desconto"].fillna(0)
df["categoria"] = df["categoria"].fillna("Outros")
# Corrigir tipos
df["valor"] = pd.to_numeric(df["valor"], errors="coerce")
df = df.dropna(subset=["valor"])
print(f"Após limpeza: {df.shape}")
# ──────────────────────────────────────────
# 3. TRANSFORMAÇÃO
# ──────────────────────────────────────────
print("\n🔄 Transformando dados...")
df["valor_liquido"] = df["valor"] * (1 - df["desconto"] / 100)
df["mes"] = df["data"].dt.to_period("M")
df["trimestre"] = df["data"].dt.to_period("Q")
# Classificar por ticket
df["ticket"] = pd.cut(df["valor_liquido"],
bins=[0, 100, 500, 1000, float("inf")],
labels=["Baixo", "Médio", "Alto", "Premium"])
# ──────────────────────────────────────────
# 4. ANÁLISE
# ──────────────────────────────────────────
print("\n📊 Gerando análises...")
# Receita total e por mês
receita_total = df["valor_liquido"].sum()
receita_mensal = df.groupby("mes")["valor_liquido"].sum()
# Análise por categoria
por_categoria = df.groupby("categoria").agg(
pedidos=("valor_liquido", "count"),
receita=("valor_liquido", "sum"),
ticket_medio=("valor_liquido", "mean")
).sort_values("receita", ascending=False)
# Top 10 produtos
top_produtos = (df.groupby("produto")["valor_liquido"]
.sum()
.sort_values(ascending=False)
.head(10))
# ──────────────────────────────────────────
# 5. RELATÓRIO
# ──────────────────────────────────────────
print("\n" + "="*50)
print("📋 RELATÓRIO DE VENDAS")
print("="*50)
print(f"💰 Receita Total: R$ {receita_total:,.2f}")
print(f"📦 Total de pedidos: {len(df):,}")
print(f"🎯 Ticket médio: R$ {df['valor_liquido'].mean():,.2f}")
print(f"\n🏆 Top 3 Categorias:\n{por_categoria.head(3)[['pedidos', 'receita']]}")
print(f"\n⭐ Top 5 Produtos:\n{top_produtos.head()}")
# Exportar
por_categoria.to_csv("analise_categorias.csv")
print("\n✅ Análise exportada em analise_categorias.csv")
⚡ Dicas de Performance
- ✅ Use
dtypeao ler CSV:pd.read_csv("f.csv", dtype={"id": int}) - ✅ Converta strings repetidas para
category: economiza muita RAM - ✅ Use
query()para filtros legíveis:df.query("salario > 5000 and area == 'TI'") - ✅ Prefira operações vetorizadas em vez de loops
- ✅ Use
chunksizepara arquivos enormes:pd.read_csv("gigante.csv", chunksize=10000) - ❌ Evite
iterrows()em DataFrames grandes — é muito lento
🚀 Próximos Passos
Agora que você domina o Pandas, o próximo passo natural é aprender a visualizar esses dados:
- Dicionários em Python — estruturas fundamentais para organizar dados
- Web Scraping com Python — colete dados reais para analisar
- Curso Completo de Python — do zero ao avançado com projetos reais
Com Pandas, você passa de simples programador para analista de dados. É uma das habilidades mais valorizadas do mercado em 2026 — comece a praticar hoje! 🎯