Pandas: Começando com Pandas
O NumPy resolveu o problema de desempenho para computação numérica em Python, mas dados do mundo real são muito mais complexos do que "arrays numericamente puros" — eles possuem nomes de colunas, tipos mistos, valores ausentes e uma variedade de formatos de arquivo. O Pandas foi construído exatamente para isso: ele fornece ao Python poder de manipulação de dados que rivaliza com o SQL, mantendo o código conciso e intuitivo. Esta seção começa com as limitações do NumPy e revela por que o Pandas é o "canivete suíço" da análise de dados.
1. O Que Você Aprenderá
- ❶ As dores de fazer análise de dados com NumPy
- ❷ Principais vantagens do Pandas (indexação por rótulos / tipos mistos / valores ausentes / IO)
- ❸ Diferenças-chave entre DataFrame e ndarray / Excel / SQL
- ❹ Uma visão geral do ecossistema do Pandas
- ❺ Instalando o Pandas e rodando seu primeiro programa
2. A Evolução do NumPy para o Pandas
(1) Ponto de Dor: O Dilema de Tipos Mistos de Alice
Alice é uma analista de dados que precisa trabalhar com dados de clientes: nomes são strings, idades são inteiros, salários são floats e datas de contratação são valores datetime. Ela tenta o NumPy primeiro:
▶ Exemplo: A Luta do NumPy com Dados de Tipos Mistos (Dificuldade ⭐)
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado — instale localmente (`pip install pandas`) para acompanhar. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.
import numpy as np
# Dados do cliente: nome(str), idade(int), salário(float)
names = np.array(['Alice', 'Bob', 'Charlie'])
ages = np.array([28, 34, 25])
salaries = np.array([75000.0, 92000.0, 68000.0])
# Problema 1: misturar tipos força a promoção para object
mixed = np.array(['Alice', 28, 75000.0])
print(mixed.dtype) # object — perde operações numéricas!
# Problema 2: não é possível calcular a média em um array object
try:
print(np.mean(mixed)) # Erro ou resultado sem significado
except TypeError:
print("Não é possível calcular a média em um array object")
# Problema 3: valores ausentes precisam de tratamento especial
ages_with_nan = np.array([28, 34, np.nan, 25])
print(np.mean(ages_with_nan)) # nan — precisa de np.nanmean()
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado — instale localmente (`pip install pandas`) para acompanhar. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.
A limitação central do NumPy é a tipagem homogênea — um único ndarray só pode armazenar um tipo de dados. Quando você coloca strings e números no mesmo array, o NumPy promove tudo para o tipo object, perdendo todas as capacidades de operação vetorizada. Além disso, o NumPy não tem o conceito de "nomes de colunas" e nenhum sistema integrado para valores ausentes (você só pode depender de np.nan, que funciona apenas com floats).
(2) Solução: O DataFrame Pandas de Bob
Bob lida com os mesmos dados usando um DataFrame do Pandas — em um único movimento fluido:
▶ Exemplo: Lidando com Dados de Tipos Mistos com Pandas (Dificuldade ⭐⭐)
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado — instale localmente (`pip install pandas`) para acompanhar. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.
import pandas as pd
# Um DataFrame lida naturalmente com tipos mistos
df = pd.DataFrame({
'nome': ['Alice', 'Bob', 'Charlie'],
'idade': [28, 34, 25],
'salario': [75000.0, 92000.0, 68000.0],
'data_contratacao': pd.to_datetime(['2022-03-15', '2019-08-01', '2023-01-10'])
})
print(df.dtypes)
# nome object
# idade int64
# salario float64
# data_contratacao datetime64[ns]
print(df['salario'].mean()) # 78333.33 — funciona naturalmente
print(df[df['idade'] > 27]) # filtrar por condição
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado — instale localmente (`pip install pandas`) para acompanhar. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.
Cada coluna mantém seu próprio tipo, operações estatísticas funcionam automaticamente e a filtragem condicional é tão intuitiva quanto SQL — essa é a beleza do Pandas.
(3) Benefício: 4 Capacidades Principais
O Pandas adiciona 4 capacidades principais além do NumPy:
| Capacidade | NumPy | Pandas |
|---|---|---|
| Indexação rotulada | Acesso apenas por posição inteira | Acesso por nome de coluna / rótulo de linha |
| Tipos mistos | Um tipo por array | Tipo independente por coluna |
| Valores ausentes | np.nan (apenas floats) |
NaN / NaT / pd.NA (cobertura completa) |
| Entrada/Saída de Dados | np.loadtxt / np.savetxt |
CSV / Excel / JSON / SQL / Parquet / HDF5 |
3. Principais Vantagens do Pandas em Detalhe
(1) Indexação por Rótulos: Dados Autoexplicativos
O NumPy acessa dados com arr[0], arr[1, 2] — você precisa lembrar que "a coluna 0 é o nome, a coluna 2 é o salário." O Pandas permite que os dados falem por si:
▶ Exemplo: Indexação por Rótulos vs Indexação Posicional (Dificuldade ⭐)
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado — instale-o localmente (`pip install pandas`) para acompanhar. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.
import numpy as np
import pandas as pd
# NumPy: deve lembrar a ordem das colunas
arr = np.array([['Alice', 28, 75000.0],
['Bob', 34, 92000.0]])
# Qual é a coluna 2? É necessário verificar a documentação
print(arr[0, 2]) # 75000.0 — mas o que isso significa?
# Pandas: os nomes das colunas são autoexplicativos
df = pd.DataFrame(arr, columns=['nome', 'idade', 'salario'])
df['idade'] = df['idade'].astype(int)
df['salario'] = df['salario'].astype(float)
print(df['salario']) # o nome da coluna diz tudo
# 0 75000.0
# 1 92000.0
print(df.loc[0, 'nome']) # Alice — acesso baseado em rótulo
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado — instale-o localmente (`pip install pandas`) para acompanhar. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.
(2) Tipos Mistos: dtype Independente por Coluna
Cada coluna em um DataFrame (uma Series) tem seu próprio dtype, assim como cada coluna em uma planilha do Excel pode ter um formato diferente.
| Recurso | NumPy ndarray | Pandas DataFrame |
|---|---|---|
| Restrição de tipo | dtype único para toda a matriz | dtype independente por coluna |
| Colunas de texto | Toda a matriz degradada para objeto | Uma única coluna como objeto / StringDtype |
| Colunas numéricas | Devem ser separadas do texto | Coexistem com colunas de texto |
| Operações | Vetorização global | Operações independentes por coluna |
(3) Tratamento de Valores Ausentes: Suporte Nativo
O Pandas fornece um sistema completo de valores ausentes com NaN (float ausente), NaT (datetime ausente) e pd.NA (ausente universal), enquanto o np.nan do NumPy só funciona com tipos float.
▶ Exemplo: Comparação de Tratamento de Valores Ausentes (Dificuldade ⭐)
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado — instale-o localmente (`pip install pandas`) para acompanhar. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.
import numpy as np
import pandas as pd
# NumPy: nan em um array de inteiros força a conversão para float
arr = np.array([1, 2, np.nan, 4])
print(arr.dtype) # float64 — os inteiros foram perdidos!
print(np.mean(arr)) # nan — precisa de np.nanmean()
# Pandas: lida com valores ausentes por coluna
s = pd.Series([1, 2, pd.NA, 4], dtype='Int64') # inteiro anulável
print(s) # mantém o tipo inteiro com <NA>
print(s.mean()) # 2.333 — ignora automaticamente os ausentes
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado — instale-o localmente (`pip install pandas`) para acompanhar. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.
(4) Ferramentas de IO Ricas: Um Hub de Dados Centralizado
▶ Exemplo: Lendo e Escrevendo Dados com Pandas (Dificuldade ⭐)
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado — instale-o localmente (`pip install pandas`) para acompanhar. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.
import pandas as pd
from io import StringIO
# Ler a partir de uma string CSV
csv_data = """nome,idade,salario
Alice,28,75000
Bob,34,92000
Charlie,25,68000"""
df = pd.read_csv(StringIO(csv_data))
print(df)
# Escrever em diferentes formatos
# df.to_csv('saida.csv', index=False)
# df.to_excel('saida.xlsx', sheet_name='Funcionarios')
# df.to_json('saida.json', orient='records')
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem o pandas pré-instalado — instale-o localmente (`pip install pandas`) para acompanhar. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.
4. DataFrame vs Excel / SQL: Uma Analogia
(1) Comparação Lado a Lado
| Conceito | Excel | Tabela SQL | DataFrame Pandas |
|---|---|---|---|
| Estrutura de dados | Planilha (Sheet) | Tabela | DataFrame |
| Linhas | Números das linhas | Linhas | Índice (rótulos de linha) |
| Colunas | Letras das colunas (A, B, C) | Nomes das colunas | Colunas (nomes das colunas) |
| Filtragem | AutoFilter | WHERE | df[condição] |
| Ordenação | Classificar | ORDER BY | df.sort_values() |
| Agrupamento | Tabela Dinâmica | GROUP BY | df.groupby() |
| Junção | PROCV | JOIN | pd.merge() |
| Adicionar colunas | Colunas de fórmula | SELECT expr | df['novo'] = expr |
| Remoção de duplicatas | Remover Duplicatas | DISTINCT | df.drop_duplicates() |
(2) Diferenças Chave
Embora todos os três compartilhem conceitos semelhantes, o DataFrame possui capacidades que o Excel e o SQL não têm:
- Programável: Automatize todas as operações com código Python, totalmente reproduzível
- Extensível: Integração perfeita com NumPy / Matplotlib / scikit-learn
- Lida com grandes volumes de dados: Processe facilmente milhões de linhas (o Excel tem um limite de ~1 milhão de linhas)
- Controle de versão: Arquivos de código podem ser gerenciados com Git; arquivos binários do Excel não podem
5. Visão Geral do Ecossistema Pandas
(1) Onde o Pandas se Encaixa na Ciência de Dados
mindmap
root((Ecossistema Pandas))
Entrada de Dados
CSV Excel JSON
Banco de Dados SQL
Parquet HDF5
Web Scraping
Processamento de Dados
Limpeza
Transformação
Mesclagem
Reformulação
Análise de Dados
Groupby Aggregate
Tabela Dinâmica
Séries Temporais
Resumo Estatístico
Saída de Dados
Visualização Matplotlib
ML scikit-learn
Relatórios HTML Excel
Fundação
NumPy ndarray
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado — instale-o localmente (`pip install pandas`) para acompanhar. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.
(2) O Papel do Pandas na Stack
O Pandas fica no núcleo da stack de ciência de dados em Python, fazendo a ponte entre o computação de baixo nível e a análise de alto nível:
| Camada | Ferramenta | Papel |
|---|---|---|
| Computação de baixo nível | NumPy | Motor de computação numérica de alto desempenho |
| Processamento de dados | Pandas | Carregamento / limpeza / transformação / análise de dados tabulares |
| Visualização | Matplotlib / Seaborn | Gráficos e plots |
| Aprendizado de máquina | scikit-learn | Treinamento e previsão de modelos |
| Aprendizado profundo | PyTorch / TensorFlow | Redes neurais |
6. Exemplo Completo: Comparação de Fluxo de Trabalho Completo NumPy vs Pandas
▶ Exemplo: Análise de Notas de Alunos — Fluxo de Trabalho Completo (Dificuldade ⭐⭐⭐)
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado — instale localmente (`pip install pandas`) para acompanhar. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.
import numpy as np
import pandas as pd
# ============================================
# Comprehensive comparison: NumPy vs Pandas
# for student grade analysis workflow
# ============================================
# --- Raw data ---
students = ['Alice', 'Bob', 'Charlie', 'Carol', 'David']
math = [85, 92, 78, 95, 88]
english = [90, 85, 82, 88, 91]
science = [88, 90, 75, 93, 86]
# --- NumPy approach ---
scores_np = np.array([math, english, science]) # shape: (3, 5)
# Which row is which subject? Must remember: row 0=math, 1=english, 2=science
# Which column is which student? Must remember order
avg_per_student = scores_np.mean(axis=0)
print("NumPy - Average per student (by position):")
for i, avg in enumerate(avg_per_student):
print(f" Student {i}: {avg:.1f}") # Who is Student 0?
# --- Pandas approach ---
df = pd.DataFrame({
'student': students,
'math': math,
'english': english,
'science': science
})
df['average'] = df[['math', 'english', 'science']].mean(axis=1)
df['grade'] = df['average'].map(
lambda x: 'A' if x >= 90 else 'B' if x >= 85 else 'C'
)
print("\nPandas - Student grades:")
print(df[['student', 'average', 'grade']])
# Top performers
top = df[df['grade'] == 'A']
print(f"\nA-grade students: {top['student'].tolist()}")
# Subject statistics
print("\nSubject statistics:")
print(df[['math', 'english', 'science']].describe())
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado — instale localmente (`pip install pandas`) para acompanhar. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.
Saída esperada (trecho):
NumPy - Average per student (by position):
Student 0: 87.7
Student 1: 89.0
Student 2: 78.3
Pandas - Student grades:
student average grade
0 Alice 87.7 B
1 Bob 89.0 B
2 Charlie 78.3 C
3 Carol 92.0 A
4 David 88.3 B
A-grade students: ['Carol']
Subject statistics:
math english science
count 5.00 5.00 5.00
mean 87.60 87.20 86.40
std 6.19 3.70 7.60
min 78.00 82.00 75.00
max 95.00 91.00 93.00
O NumPy consegue fazer os cálculos, mas os resultados carecem de "autodescritividade" — você precisa lembrar separadamente qual número corresponde a qual aluno. O Pandas mantém os dados e os rótulos vinculados o tempo todo, tornando os resultados imediatamente claros.
7. Instalação e Verificação
(1) Métodos de Instalação
| Método | Comando | Caso de Uso |
|---|---|---|
| pip | pip install pandas |
Mais universal |
| conda | conda install pandas |
Ambientes Anaconda |
| A partir do código-fonte | pip install . |
Desenvolvedores / colaboradores |
▶ Exemplo: Verificando Sua Instalação (Dificuldade ⭐)
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado — instale-o localmente (`pip install pandas`) para acompanhar. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.
import pandas as pd
import numpy as np
print(f"Pandas version: {pd.__version__}")
print(f"NumPy version: {np.__version__}")
# Quick functionality check
df = pd.DataFrame({'x': [1, 2, 3], 'y': [4, 5, 6]})
print(df)
print(f"\nMean of x: {df['x'].mean()}")
> **Saída:** Execute isso em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado — instale-o localmente (`pip install pandas`) para acompanhar. Os valores reais podem variar ligeiramente dependendo da sua versão do pandas.
(2) Notas de Versão
| Versão | Status | Notas |
|---|---|---|
| Pandas 3.x | Mais recente | Lançado em 2026, Copy-on-Write ativado por padrão |
| Pandas 2.x | Amplamente usado | Lançado em 2023, melhorias significativas de desempenho |
| Pandas 1.x | Legado | Alguma sintaxe foi descontinuada |
append) foi removida na 2.0 e não é mais usada aqui.
❓ Perguntas Frequentes
P: Qual é a relação entre Pandas e NumPy? R: O Pandas é construído sobre o NumPy. As colunas numéricas de um DataFrame são ndarrays nos bastidores — quando você realiza operações em colunas numéricas, na verdade está chamando funções do NumPy. O Pandas adiciona indexação com rótulos, tipos mistos, tratamento de valores ausentes e ferramentas de IO sobre o NumPy.
P: Por que aprender Pandas depois do NumPy? R: O NumPy é um motor de computação; o Pandas é uma ferramenta de análise de dados. Dados do mundo real possuem nomes de colunas, tipos mistos, valores ausentes e múltiplos formatos de arquivo — lidar com isso usando NumPy requer muito trabalho manual, enquanto o Pandas suporta essas características nativamente. 95% do trabalho de análise de dados é feito com Pandas; você só recorre ao NumPy quando precisa de computação numérica de alto desempenho.
P: Qual é a diferença entre um DataFrame e o Excel? R: Conceitualmente, eles são semelhantes (ambos são tabelas 2D), mas um DataFrame é programável: automatize operações com código Python, lide com milhões de linhas, integre com bibliotecas de ML e use o controle de versão Git. O Excel é ótimo para interação manual e apresentação de relatórios; os DataFrames são construídos para pipelines automatizados de processamento de dados.
P: O Pandas pode substituir o SQL? R: Não totalmente. O Pandas se destaca em trabalho analítico (exploração/limpeza/transformação), enquanto o SQL se destaca em trabalho de consultas (joins de múltiplas tabelas/transações/concorrência). Uma combinação comum: use SQL para extrair dados de um banco de dados e depois use Pandas para análise. Para conjuntos de dados com menos de um milhão de linhas, o Pandas pode substituir a maioria das funcionalidades analíticas do SQL.
P: Quais são as principais diferenças entre o Pandas 2.x e 1.x? R: Três grandes mudanças: (1) O Copy-on-Write é ativado por padrão, prevenindo a modificação acidental de views; (2) APIs descontinuadas como
appendeDataFrame.ixforam removidas; (3) O PyArrow é usado nos bastidores para melhor desempenho. Este tutorial usa a sintaxe 2.x/3.x — usuários da versão 1.x devem fazer upgrade.
P: Como o Pandas performa com grandes volumes de dados? R: O Pandas é bem adequado para análise em máquina única na escala de milhões de linhas. Para dados maiores (escala de bilhões), considere: (1) Dask — uma versão distribuída da API do Pandas; (2) Polars — uma biblioteca alternativa mais rápida (implementada em Rust); (3) PySpark — um framework de computação distribuída. O Pandas continua sendo a escolha principal para aprendizado e prototipagem.
P: Por que o código diz "requires a local Python environment"? R: Nosso editor online não suporta a execução do Pandas (devido a restrições de memória e segurança). Por favor, instale o Python + Pandas localmente para executar o código de exemplo. A instalação leva apenas um comando:
pip install pandas.
📖 Resumo
- O Pandas adiciona 4 capacidades principais sobre o NumPy: indexação rotulada, tipos mistos, tratamento de valores ausentes e ferramentas robustas de E/S
- DataFrame ≈ uma planilha Excel programável ≈ uma tabela SQL em memória, mas com vantagens de automação / extensibilidade / controle de versão
- Pandas está no núcleo da pilha de ciência de dados em Python: NumPy → Pandas → Matplotlib/scikit-learn
- 95% do trabalho de análise de dados é feito com Pandas; NumPy é o mecanismo de computação subjacente
- Pandas 2.x/3.x são as versões principais atuais; algumas sintaxes da 1.x foram descontinuadas
- Para dados que excedam a capacidade de uma única máquina, escale para Dask/Polars/PySpark
📝 Exercícios
- Básico (Dificuldade ⭐): Instale o Pandas e execute o código de verificação para confirmar que
pd.__version__retorna corretamente. Crie um DataFrame com 3 colunas (nome / idade / cidade) e imprima-o. - Intermediário (Dificuldade ⭐⭐): Processe os mesmos dados de notas de alunos (5 alunos / 3 disciplinas) tanto com NumPy quanto com Pandas. Calcule a média de cada aluno e a nota mais alta por disciplina. Compare o volume de código e a legibilidade de ambas as abordagens.
- Desafio (Dificuldade ⭐⭐⭐): Carregue dados contendo valores ausentes a partir de uma string CSV e, em seguida, use o Pandas para: visualizar info → preencher os valores ausentes → agrupar por categoria e calcular estatísticas → exibir o describe. Use apenas Pandas durante todo o processo — loops não são permitidos.