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 dtype ao 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 chunksize para 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:

Com Pandas, você passa de simples programador para analista de dados. É uma das habilidades mais valorizadas do mercado em 2026 — comece a praticar hoje! 🎯