Guia

Análise de Dados com Pandas: Guia

Aprenda análise de dados com Pandas em Python. DataFrames, leitura de arquivos, filtragem, agrupamento, visualização e exemplos práticos

5 min de leitura

Introdução

Pandas é a biblioteca mais importante para análise de dados em Python. Usada por cientistas de dados, analistas e engenheiros em todo o mundo, ela permite carregar, manipular, limpar e analisar dados de forma eficiente e intuitiva.

Neste guia, vamos aprender Pandas do básico ao intermediário, com exemplos práticos usando dados reais.

Instalação

pip install pandas matplotlib openpyxl

O matplotlib é para gráficos e o openpyxl para ler e escrever arquivos Excel.

Estruturas de dados

O Pandas tem duas estruturas principais:

Series

Uma coluna de dados com índice:

import pandas as pd

notas = pd.Series([8.5, 7.0, 9.2, 6.8], index=["Ana", "Carlos", "Maria", "Pedro"])
print(notas)
print(f"Media: {notas.mean():.1f}")
print(f"Maior nota: {notas.max()} ({notas.idxmax()})")

DataFrame

Uma tabela com linhas e colunas:

dados = {
    "nome": ["Ana", "Carlos", "Maria", "Pedro"],
    "idade": [25, 30, 22, 28],
    "cidade": ["Sao Paulo", "Rio de Janeiro", "Curitiba", "Salvador"],
    "salario": [5500, 7200, 4800, 6100],
}

df = pd.DataFrame(dados)
print(df)

Saída:

     nome  idade          cidade  salario
0     Ana     25       Sao Paulo     5500
1  Carlos     30  Rio de Janeiro     7200
2   Maria     22        Curitiba     4800
3   Pedro     28        Salvador     6100

Lendo dados de arquivos

CSV

df = pd.read_csv("dados.csv")
df = pd.read_csv("dados.csv", sep=";", encoding="utf-8")
df = pd.read_csv("dados.csv", parse_dates=["data_nascimento"])

Excel

df = pd.read_excel("dados.xlsx", sheet_name="Planilha1")

JSON

df = pd.read_json("dados.json")

SQL

import sqlite3

conn = sqlite3.connect("banco.db")
df = pd.read_sql("SELECT * FROM clientes", conn)

Explorando os dados

Depois de carregar um DataFrame, explore-o:

# Primeiras e ultimas linhas
df.head()       # Primeiras 5 linhas
df.tail(3)      # Ultimas 3 linhas

# Informacoes gerais
df.info()       # Tipos de dados, valores nulos
df.describe()   # Estatisticas descritivas
df.shape        # (linhas, colunas)
df.columns      # Nomes das colunas
df.dtypes       # Tipos de cada coluna

# Valores unicos
df["cidade"].unique()       # Valores unicos
df["cidade"].nunique()      # Quantidade de valores unicos
df["cidade"].value_counts() # Contagem de cada valor

Selecionando dados

Por coluna

# Uma coluna (retorna Series)
nomes = df["nome"]

# Multiplas colunas (retorna DataFrame)
subset = df[["nome", "salario"]]

Por condição (filtragem)

# Filtrar por condicao
ricos = df[df["salario"] > 6000]

# Multiplas condicoes
filtro = df[(df["idade"] > 25) & (df["salario"] > 5000)]

# Usando isin
cidades = df[df["cidade"].isin(["Sao Paulo", "Curitiba"])]

# Filtrando strings
df[df["nome"].str.contains("ar")]
df[df["nome"].str.startswith("M")]

Por posição e rótulo

# Por posicao (iloc)
df.iloc[0]          # Primeira linha
df.iloc[0:3]        # Linhas 0 a 2
df.iloc[0, 1]       # Linha 0, coluna 1

# Por rotulo (loc)
df.loc[0, "nome"]   # Linha com indice 0, coluna "nome"
df.loc[df["idade"] > 25, ["nome", "salario"]]

Manipulando dados

Criando novas colunas

# Coluna calculada
df["salario_anual"] = df["salario"] * 12

# Coluna condicional
df["faixa"] = df["salario"].apply(
    lambda x: "Alto" if x > 6000 else "Medio" if x > 5000 else "Inicial"
)

# Usando np.where
import numpy as np
df["senior"] = np.where(df["idade"] >= 28, "Sim", "Nao")

Renomeando colunas

df = df.rename(columns={"nome": "funcionario", "salario": "remuneracao"})

Ordenando

df_ordenado = df.sort_values("salario", ascending=False)
df_ordenado = df.sort_values(["cidade", "salario"], ascending=[True, False])

Removendo duplicatas e valores nulos

# Remover duplicatas
df = df.drop_duplicates()
df = df.drop_duplicates(subset=["nome", "cidade"])

# Verificar valores nulos
df.isnull().sum()

# Remover linhas com valores nulos
df = df.dropna()

# Preencher valores nulos
df["salario"] = df["salario"].fillna(df["salario"].median())
df["cidade"] = df["cidade"].fillna("Nao informada")

Agrupamento e agregação

O groupby é uma das funcionalidades mais poderosas do Pandas:

# Agrupar por cidade e calcular estatisticas
por_cidade = df.groupby("cidade")["salario"].agg(["mean", "min", "max", "count"])
print(por_cidade)

# Multiplas colunas
resumo = df.groupby("cidade").agg(
    salario_medio=("salario", "mean"),
    idade_media=("idade", "mean"),
    total_funcionarios=("nome", "count"),
)

Exemplo prático: análise de vendas

Vamos criar e analisar um conjunto de dados de vendas:

import pandas as pd
import numpy as np

# Gerar dados de exemplo
np.random.seed(42)
n = 500

vendas = pd.DataFrame({
    "data": pd.date_range("2025-01-01", periods=n, freq="D"),
    "produto": np.random.choice(["Notebook", "Mouse", "Teclado", "Monitor"], n),
    "regiao": np.random.choice(["Sudeste", "Sul", "Nordeste", "Norte"], n),
    "quantidade": np.random.randint(1, 20, n),
    "preco_unitario": np.random.uniform(50, 5000, n).round(2),
})

vendas["total"] = vendas["quantidade"] * vendas["preco_unitario"]
vendas["mes"] = vendas["data"].dt.month
vendas["trimestre"] = vendas["data"].dt.quarter

Agora, vamos analisar:

# Resumo geral
print(f"Total de vendas: R$ {vendas['total'].sum():,.2f}")
print(f"Ticket medio: R$ {vendas['total'].mean():,.2f}")
print(f"Periodo: {vendas['data'].min()} a {vendas['data'].max()}")

# Vendas por produto
por_produto = vendas.groupby("produto").agg(
    receita=("total", "sum"),
    quantidade=("quantidade", "sum"),
    ticket_medio=("total", "mean"),
).sort_values("receita", ascending=False)
print(por_produto)

# Vendas por regiao e trimestre
por_regiao_trim = vendas.pivot_table(
    values="total",
    index="regiao",
    columns="trimestre",
    aggfunc="sum",
)
print(por_regiao_trim)

# Top 10 maiores vendas
top10 = vendas.nlargest(10, "total")[["data", "produto", "total"]]
print(top10)

Visualização com Pandas

O Pandas integra com Matplotlib para gráficos rápidos:

import matplotlib.pyplot as plt

# Grafico de barras
por_produto["receita"].plot(kind="bar", title="Receita por Produto")
plt.ylabel("Receita (R$)")
plt.tight_layout()
plt.savefig("receita_produto.png")
plt.show()

# Grafico de linha (evolucao mensal)
vendas_mensais = vendas.groupby("mes")["total"].sum()
vendas_mensais.plot(kind="line", marker="o", title="Evolucao Mensal de Vendas")
plt.xlabel("Mes")
plt.ylabel("Total (R$)")
plt.tight_layout()
plt.show()

Salvando resultados

# Salvar em CSV
df.to_csv("resultado.csv", index=False, encoding="utf-8")

# Salvar em Excel
df.to_excel("resultado.xlsx", index=False, sheet_name="Dados")

# Salvar multiplas planilhas
with pd.ExcelWriter("relatorio.xlsx") as writer:
    df.to_excel(writer, sheet_name="Dados", index=False)
    por_produto.to_excel(writer, sheet_name="Por Produto")

Dicas de desempenho

  • Use dtypes otimizados: converta strings para category quando há poucos valores únicos
  • Leia apenas as colunas necessárias: pd.read_csv("dados.csv", usecols=["nome", "salario"])
  • Para datasets muito grandes, considere polars ou dask como alternativas
  • Evite loops for sobre DataFrames; use operações vetorizadas

Conclusão

Pandas é uma ferramenta indispensável para quem trabalha com dados em Python. Com DataFrames, você pode carregar dados de praticamente qualquer fonte, limpar, transformar, analisar e visualizar resultados de forma eficiente. Os conceitos de filtragem, agrupamento e agregação apresentados neste guia cobrem a grande maioria das tarefas de análise de dados do dia a dia. A prática com dados reais é o melhor caminho para dominar a biblioteca.