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
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
dtypesotimizados: converta strings paracategoryquando há poucos valores únicos - Leia apenas as colunas necessárias:
pd.read_csv("dados.csv", usecols=["nome", "salario"]) - Para datasets muito grandes, considere
polarsoudaskcomo alternativas - Evite loops
forsobre 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.