Pandas: manipulação e análise de dados com Python
Aprenda a carregar, limpar, filtrar e transformar dados com Pandas. A ferramenta essencial de Data Science.
O que é Pandas?
Pandas é a biblioteca mais importante para análise de dados em Python. Pense nela como um Excel turbinado: você pode carregar planilhas, filtrar dados, fazer cálculos e gerar relatórios, tudo com poucas linhas de código.
O nome vem de "Panel Data", um termo de econometria para dados multidimensionais. A biblioteca foi criada em 2008 por Wes McKinney e hoje é usada por milhões de profissionais no mundo todo.
import pandas as pd
A convenção é importar Pandas como pd. Você vai ver isso em todo código de Data Science.
Series vs DataFrame
Pandas tem duas estruturas principais:
Series — Uma coluna de dados com índice. Pense como uma lista com rótulos.
import pandas as pd
notas = pd.Series([7.5, 8.0, 6.5, 9.0], index=["Ana", "Bruno", "Carol", "Diego"])
print(notas)
# Ana 7.5
# Bruno 8.0
# Carol 6.5
# Diego 9.0
# dtype: float64
DataFrame — Uma tabela com linhas e colunas. É a estrutura que você mais vai usar.
import pandas as pd
dados = {
"nome": ["Ana", "Bruno", "Carol", "Diego"],
"idade": [22, 25, 21, 28],
"nota": [7.5, 8.0, 6.5, 9.0]
}
df = pd.DataFrame(dados)
print(df)
# nome idade nota
# 0 Ana 22 7.5
# 1 Bruno 25 8.0
# 2 Carol 21 6.5
# 3 Diego 28 9.0
Lendo dados de arquivos
Na vida real, você raramente cria DataFrames na mão. O mais comum é carregar dados de arquivos:
import pandas as pd
# CSV (o formato mais comum)
df = pd.read_csv("vendas.csv")
# Excel
df = pd.read_excel("relatorio.xlsx")
# JSON
df = pd.read_json("dados.json")
# Com separador diferente (ponto e virgula, comum em CSVs brasileiros)
df = pd.read_csv("dados.csv", sep=";", encoding="utf-8")
Para este artigo, vamos criar um dataset de exemplo:
import pandas as pd
dados = {
"funcionario": ["Ana", "Bruno", "Carol", "Diego", "Eva",
"Felipe", "Gabi", "Hugo", "Iris", "Jonas"],
"departamento": ["TI", "RH", "TI", "Vendas", "RH",
"TI", "Vendas", "TI", "RH", "Vendas"],
"salario": [5500, 4200, 6100, 3800, 4500,
7200, 4100, 5800, 4300, 3900],
"anos_empresa": [3, 5, 7, 2, 4, 10, 1, 6, 3, 2],
"avaliacao": [8.5, 7.0, 9.0, 6.5, 7.5, 9.5, None, 8.0, None, 7.0]
}
df = pd.DataFrame(dados)
Explorando os dados
Antes de qualquer análise, você precisa entender seus dados. Pandas oferece vários métodos para isso:
# Primeiras 5 linhas
print(df.head())
# Ultimas 3 linhas
print(df.tail(3))
# Dimensoes do DataFrame
print(df.shape) # (10, 5) -> 10 linhas, 5 colunas
# Tipos de dados e valores nao nulos
print(df.info())
# Estatisticas descritivas das colunas numericas
print(df.describe())
# Nomes das colunas
print(df.columns.tolist())
O método describe() retorna uma tabela completa com contagem, média, desvio padrão, mínimo, quartis e máximo:
| Estatística | salario | anos_empresa | avaliacao |
|---|---|---|---|
| count | 10.0 | 10.0 | 8.0 |
| mean | 4940.0 | 4.3 | 7.875 |
| std | 1110.2 | 2.75 | 1.01 |
| min | 3800.0 | 1.0 | 6.5 |
| max | 7200.0 | 10.0 | 9.5 |
Selecionando colunas e linhas
Selecionando colunas
# Uma coluna (retorna Series)
nomes = df["funcionario"]
# Varias colunas (retorna DataFrame)
subset = df[["funcionario", "salario"]]
Selecionando linhas com loc e iloc
# loc: seleciona por rotulo (nome do indice)
print(df.loc[0]) # Linha com indice 0
print(df.loc[0:3]) # Linhas de 0 a 3 (inclui o 3!)
print(df.loc[0, "funcionario"]) # Valor especifico
# iloc: seleciona por posicao (numero inteiro)
print(df.iloc[0]) # Primeira linha
print(df.iloc[0:3]) # Primeiras 3 linhas (nao inclui o 3)
print(df.iloc[0, 0]) # Primeiro valor
A diferença principal: loc inclui o final do intervalo, iloc não inclui (como listas Python).
Filtrando dados com condições
Filtrar é uma das operações mais comuns. Use condições dentro dos colchetes:
# Funcionarios com salario acima de 5000
ricos = df[df["salario"] > 5000]
print(ricos)
# Funcionarios do departamento de TI
ti = df[df["departamento"] == "TI"]
print(ti)
# Combinando condicoes (use & para "e", | para "ou")
ti_senior = df[(df["departamento"] == "TI") & (df["anos_empresa"] >= 5)]
print(ti_senior)
# Filtrar por lista de valores
vendas_rh = df[df["departamento"].isin(["Vendas", "RH"])]
print(vendas_rh)
# Filtrar por texto (contem determinada string)
nomes_com_a = df[df["funcionario"].str.startswith("A")]
print(nomes_com_a)
Lidando com dados ausentes
Dados do mundo real quase sempre têm valores faltantes. Pandas usa NaN (Not a Number) para representar ausências:
# Verificar quais valores estao ausentes
print(df.isna())
# Contar valores ausentes por coluna
print(df.isna().sum())
# funcionario 0
# departamento 0
# salario 0
# anos_empresa 0
# avaliacao 2
# Preencher valores ausentes com a media
df["avaliacao"] = df["avaliacao"].fillna(df["avaliacao"].mean())
# Ou remover linhas com valores ausentes
df_limpo = df.dropna()
# Remover linhas onde uma coluna especifica e nula
df_limpo = df.dropna(subset=["avaliacao"])
GroupBy: agrupamento e agregações
O groupby é um dos recursos mais poderosos do Pandas. Ele permite agrupar dados por uma coluna e calcular estatísticas para cada grupo:
# Media salarial por departamento
print(df.groupby("departamento")["salario"].mean())
# departamento
# RH 4333.33
# TI 6150.00
# Vendas 3933.33
# Varias estatisticas de uma vez
resumo = df.groupby("departamento")["salario"].agg(["mean", "min", "max", "count"])
print(resumo)
# Agrupar e agregar varias colunas
resumo_completo = df.groupby("departamento").agg({
"salario": "mean",
"anos_empresa": "mean",
"avaliacao": "mean"
}).round(1)
print(resumo_completo)
Ordenando dados
# Ordenar por salario (crescente)
df_ordenado = df.sort_values("salario")
# Ordenar por salario (decrescente)
df_ordenado = df.sort_values("salario", ascending=False)
# Ordenar por multiplas colunas
df_ordenado = df.sort_values(["departamento", "salario"], ascending=[True, False])
Criando novas colunas
Você pode criar colunas calculadas a partir de outras:
# Salario anual
df["salario_anual"] = df["salario"] * 13 # Com 13o salario
# Faixa salarial usando apply
def classificar_salario(valor):
if valor >= 6000:
return "Alto"
elif valor >= 4500:
return "Medio"
else:
return "Baixo"
df["faixa"] = df["salario"].apply(classificar_salario)
print(df[["funcionario", "salario", "faixa"]])
Merge: juntando DataFrames
Assim como JOIN no SQL, o Pandas permite combinar DataFrames:
import pandas as pd
# DataFrame de funcionarios
funcionarios = pd.DataFrame({
"id": [1, 2, 3, 4],
"nome": ["Ana", "Bruno", "Carol", "Diego"],
"depto_id": [10, 20, 10, 30]
})
# DataFrame de departamentos
departamentos = pd.DataFrame({
"depto_id": [10, 20, 30],
"depto_nome": ["TI", "RH", "Vendas"]
})
# Juntar os dois DataFrames
resultado = pd.merge(funcionarios, departamentos, on="depto_id")
print(resultado)
# id nome depto_id depto_nome
# 0 1 Ana 10 TI
# 1 2 Bruno 20 RH
# 2 3 Carol 10 TI
# 3 4 Diego 30 Vendas
Tipos de merge disponíveis:
| Tipo | Descrição |
|---|---|
inner |
Apenas registros presentes em ambos (padrão) |
left |
Todos do DataFrame da esquerda |
right |
Todos do DataFrame da direita |
outer |
Todos de ambos os DataFrames |
resultado = pd.merge(funcionarios, departamentos, on="depto_id", how="left")
Exemplo prático: análise de vendas
Vamos fazer uma análise completa com Pandas:
import pandas as pd
# Criando dataset de vendas
vendas = pd.DataFrame({
"data": pd.date_range("2026-01-01", periods=20, freq="D"),
"produto": ["Notebook", "Mouse", "Teclado", "Monitor"] * 5,
"quantidade": [2, 15, 8, 3, 1, 20, 10, 2, 3, 12,
6, 4, 2, 18, 9, 1, 4, 25, 7, 3],
"preco_unitario": [3500, 80, 150, 1200] * 5
})
# Calcular faturamento
vendas["faturamento"] = vendas["quantidade"] * vendas["preco_unitario"]
# Resumo por produto
resumo = vendas.groupby("produto").agg({
"quantidade": "sum",
"faturamento": "sum"
}).sort_values("faturamento", ascending=False)
print("=== Faturamento por Produto ===")
print(resumo)
print()
# Dia com maior faturamento
melhor_dia = vendas.groupby("data")["faturamento"].sum().idxmax()
print(f"Dia com maior faturamento: {melhor_dia.strftime('%d/%m/%Y')}")
# Faturamento total
total = vendas["faturamento"].sum()
print(f"Faturamento total: R$ {total:,.2f}")
# Exportar resultado para CSV
resumo.to_csv("resumo_vendas.csv")
print("\nArquivo 'resumo_vendas.csv' salvo com sucesso!")
Resumo dos comandos
| Operação | Comando |
|---|---|
| Ler CSV | pd.read_csv("arquivo.csv") |
| Primeiras linhas | df.head() |
| Informações | df.info() |
| Estatísticas | df.describe() |
| Selecionar coluna | df["coluna"] |
| Filtrar | df[df["coluna"] > valor] |
| Valores nulos | df.isna().sum() |
| Preencher nulos | df.fillna(valor) |
| Agrupar | df.groupby("coluna").mean() |
| Ordenar | df.sort_values("coluna") |
| Nova coluna | df["nova"] = df["a"] + df["b"] |
| Juntar tabelas | pd.merge(df1, df2, on="chave") |
| Salvar CSV | df.to_csv("arquivo.csv") |
Conclusão
Pandas é a ferramenta que vai acompanhar você em praticamente todo projeto de Data Science. Com ela, você consegue carregar dados de qualquer fonte, limpar inconsistências, filtrar e agrupar informações, e extrair insights valiosos. Os conceitos que vimos aqui — DataFrame, seleção, filtragem, groupby e merge — são a base para qualquer análise. No próximo artigo, vamos aprender a transformar esses dados em gráficos profissionais com Matplotlib e Seaborn.