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.

⚠️ Nota: O código abaixo requer um ambiente Python local para ser executado.

1. O Que Você Aprenderá



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 ⭐)

TEXT 📖 Somente leitura
> **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.
PYTHON
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()
TEXT 📖 Somente leitura
> **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 ⭐⭐)

TEXT 📖 Somente leitura
> **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.
PYTHON
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
TEXT 📖 Somente leitura
> **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 ⭐)

TEXT 📖 Somente leitura
> **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.
PYTHON
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
TEXT 📖 Somente leitura
> **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 ⭐)

TEXT 📖 Somente leitura
> **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.
PYTHON
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
TEXT 📖 Somente leitura
> **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 ⭐)

TEXT 📖 Somente leitura
> **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.
PYTHON
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')
TEXT 📖 Somente leitura
> **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:



5. Visão Geral do Ecossistema Pandas

(1) Onde o Pandas se Encaixa na Ciência de Dados

100%
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
TEXT 📖 Somente leitura
> **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
💡 Dica: Sob o capô, um DataFrame do Pandas é suportado por ndarrays do NumPy — quando você realiza operações em colunas numéricas, na verdade está chamando as funções vectorized do NumPy. O Pandas é a camada que "faz o NumPy trabalhar com dados tabulares."



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 ⭐⭐⭐)

TEXT 📖 Somente leitura
> **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.
PYTHON
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())
TEXT 📖 Somente leitura
> **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):

TEXT 📖 Somente leitura
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
💡 Dica: O Pandas instala automaticamente o NumPy como dependência. Se você já tiver o NumPy instalado, o Pandas reutilizará a versão existente.

▶ Exemplo: Verificando Sua Instalação (Dificuldade ⭐)

TEXT 📖 Somente leitura
> **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.
PYTHON
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()}")
TEXT 📖 Somente leitura
> **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
⚠️ Nota: Este tutorial foi escrito para Pandas 2.x / 3.x. Alguma sintaxe 1.x (como 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 append e DataFrame.ix foram 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


📝 Exercícios

  1. 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.
  2. 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.
  3. 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.

Next: Getting Started with Series →

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%