Pandas foi a biblioteca Python padrão para análise de dados por mais de uma década. Em 2026, ainda está em todo lugar — mas não é mais a escolha óbvia. Uma nova geração de bibliotecas oferece desempenho drasticamente superior, menor consumo de memória e APIs mais intuitivas.
Este guia compara as principais opções e ajuda a determinar qual se adapta melhor a diferentes casos de uso.
Os competidores
| Biblioteca | Maturidade | Escrita em | Principal vantagem |
|---|---|---|---|
| Pandas 2.2 | Madura | C/Python | Ecossistema, familiaridade |
| Polars 1.x | Estável | Rust | Velocidade, eficiência de memória |
| DuckDB 1.x | Estável | C++ | Interface SQL, zero-copy |
| Modin | Estável | Python | Substituto drop-in do Pandas |
| Vaex | Manutenção | C++/Python | Processamento out-of-core |
| DataFusion (Python) | Em crescimento | Rust | Nativo Apache Arrow |
Desempenho: O que os benchmarks mostram
Em vez de inventar números, aqui está o que benchmarks oficiais e de terceiros demonstram:
Benchmark Polars PDS-H (derivado do TPC-H)
A equipe do Polars mantém uma suíte de benchmarks open source derivada do benchmark de suporte a decisões TPC-H, chamada PDS-H. Os resultados mais recentes (maio de 2025) comparam Polars com Pandas e outros motores em consultas analíticas padronizadas.
Principais conclusões do benchmark oficial:
- Polars supera consistentemente o Pandas por uma margem significativa em todas as 22 consultas derivadas do TPC-H
- Polars usa substancialmente menos memória que o Pandas para operações equivalentes
- O benchmark é open source no GitHub, então os resultados são reproduzíveis
Estudo de energia e desempenho
Um estudo separado de benchmark energético do Polars constatou que Polars consumiu aproximadamente 8× menos energia que o Pandas em tarefas sintéticas de análise de dados com grandes DataFrames, e usou cerca de 63% da energia exigida pelo Pandas para consultas do tipo TPC-H em grandes conjuntos de dados.
Características gerais de desempenho
Com base em benchmarks publicados e relatos da comunidade:
- Polars e DuckDB são significativamente mais rápidos que o Pandas para a maioria das operações analíticas, particularmente em conjuntos de dados acima de 1M de linhas
- DuckDB tende a ser especialmente forte em cargas de trabalho pesadas em agregação e joins
- Modin oferece acelerações modestas em relação ao Pandas, mas ao custo de maior uso de memória
- Pandas 2.x com dtypes baseados em Arrow é consideravelmente mais rápido que o Pandas 1.x
Nota: As proporções exatas de desempenho dependem fortemente do hardware, formato dos dados e complexidade das consultas. Sempre faça benchmarks nas suas próprias cargas de trabalho.
Polars — O novo padrão para trabalho crítico em desempenho
Para novos projetos onde o desempenho importa, Polars emergiu como a principal alternativa ao Pandas.
import polars as pl
df = pl.read_parquet("events.parquet")
result = (
df.lazy()
.filter(pl.col("event_type") == "purchase")
.group_by("user_id")
.agg([
pl.col("amount").sum().alias("total_spent"),
pl.col("amount").count().alias("num_purchases"),
])
.sort("total_spent", descending=True)
.head(100)
.collect()
)
Por que Polars se destaca:
- Significativamente mais rápido que o Pandas na maioria das operações — confirmado pelos benchmarks oficiais PDS-H (fonte)
- Avaliação lazy que otimiza o plano de consulta antes da execução. Escrever
.lazy()no início e.collect()no final é a maior otimização de desempenho disponível - API consistente que evita as muitas armadilhas do Pandas (
SettingWithCopyWarning, alguém?) - Baseado em Rust com paralelismo real — utiliza todos os cores disponíveis por padrão
As desvantagens honestas:
- Lacuna no ecossistema: muitas bibliotecas ainda esperam DataFrames do Pandas. A conversão com
.to_pandas()é às vezes inevitável - A integração com gráficos é mais fraca — Matplotlib/Seaborn esperam entrada do Pandas
- A API é diferente o suficiente para haver uma curva de aprendizado real. Equipes experientes em Pandas devem reservar aproximadamente uma semana para a transição
DuckDB — Quando SQL é a interface preferida
DuckDB não é uma biblioteca de DataFrames — é um banco de dados analítico embarcado. Mas tornou-se uma das melhores formas de analisar dados em Python.
import duckdb
result = duckdb.sql("""
SELECT
user_id,
SUM(amount) as total_spent,
COUNT(*) as num_purchases
FROM read_parquet('events.parquet')
WHERE event_type = 'purchase'
GROUP BY user_id
ORDER BY total_spent DESC
LIMIT 100
""").fetchdf()
Por que DuckDB é convincente:
- Excelente desempenho em agregação — competitivo ou mais rápido que Polars em operações de groupby e join
- Integração zero-copy com Pandas, Polars e Arrow. Consultas SQL podem referenciar DataFrames do Pandas sem copiar dados
- Lê Parquet, CSV, JSON diretamente — sem etapa explícita de carregamento
- Embarcado — sem servidor, sem configuração, apenas
pip install duckdb
Quando escolher DuckDB em vez de Polars:
- A equipe é mais confortável com SQL do que com method chaining
- Consultar arquivos diretamente sem construir um pipeline
- Unir dados de diferentes formatos (CSV + Parquet + JSON)
Quando Polars é a melhor escolha:
- Transformações complexas de múltiplas etapas (method chaining tende a ser mais legível que SQL aninhado)
- Construir pipelines de dados em código Python
- Quando controle granular sobre a execução é necessário
Pandas 2.2 — Ainda relevante (com ressalvas)
Pandas não está morto. Com dtypes baseados em Arrow na versão 2.x, é significativamente mais rápido que o Pandas 1.x:
import pandas as pd
# Usar dtypes Arrow para melhor desempenho
df = pd.read_parquet("events.parquet", dtype_backend="pyarrow")
Ainda escolher Pandas quando:
- A equipe já o conhece bem e o desempenho é adequado
- Máxima compatibilidade com bibliotecas é necessária (scikit-learn, statsmodels, etc.)
- Trabalhando com conjuntos de dados pequenos (<1M linhas) onde diferenças de desempenho são negligenciáveis
- Fazendo análise exploratória em notebooks Jupyter
Considerar alternativas quando:
- Os conjuntos de dados excedem a RAM disponível
- Construindo pipelines de dados de produção onde desempenho importa
- Trabalhando regularmente com conjuntos de dados acima de 10M linhas
Modin — Uma recomendação difícil
Modin promete acelerar o Pandas alterando uma única linha de import. Na prática, os compromissos são significativos:
- Maior uso de memória que o próprio Pandas (distribui dados entre processos)
- Cobertura de API incompleta — algumas operações recorrem silenciosamente ao Pandas
- Overhead de inicialização que o torna mais lento para conjuntos de dados pequenos
- Complexidade de depuração aumenta quando a execução distribuída encontra problemas
Avaliação: Para a maioria das equipes, é melhor ficar com o Pandas (pela compatibilidade) ou migrar para o Polars (pelo desempenho). Modin ocupa um meio-termo desconfortável que não satisfaz plenamente nenhum dos objetivos.
O framework de decisão
Os dados são < 1M linhas?
→ Pandas (com dtypes Arrow) funciona bem. Não complique.
A equipe prefere SQL?
→ DuckDB.
Construindo um pipeline de dados Python?
→ Polars.
Precisa consultar arquivos sem carregá-los?
→ DuckDB.
Dados > 100M linhas em uma única máquina?
→ Polars (modo lazy) ou DuckDB.
Dados maiores que a RAM disponível?
→ DuckDB ou Polars (modo streaming).
Leitura complementar
- Resultados do Benchmark Polars PDS-H (maio de 2025)
- Estudo de energia e desempenho do Polars
- Repositório de Benchmarks do Polars (GitHub)
- Documentação do DuckDB
- Pandas 2.x Arrow Backend
Dúvidas sobre migração do Pandas? Entre em contato: [email protected].