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

BibliotecaMaturidadeEscrita emPrincipal vantagem
Pandas 2.2MaduraC/PythonEcossistema, familiaridade
Polars 1.xEstávelRustVelocidade, eficiência de memória
DuckDB 1.xEstávelC++Interface SQL, zero-copy
ModinEstávelPythonSubstituto drop-in do Pandas
VaexManutençãoC++/PythonProcessamento out-of-core
DataFusion (Python)Em crescimentoRustNativo 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

Dúvidas sobre migração do Pandas? Entre em contato: [email protected].