Pular para o conteúdo

Polars - Biblioteca de DataFrame Rápida - Guia de Referência

Polars - Biblioteca de DataFrame Rápida - Guia de Referência

Polars é uma biblioteca de alto desempenho DataFrame escrita em Rust com bindings para Python, R e Node. É multi-threaded por padrão, construída em Apache Arrow columnar memory e oferece uma API lazy com um otimizador de consulta que reordena e poda trabalho antes de executar. Em grandes conjuntos de dados é tipicamente muitas vezes mais rápida que pandas e usa menos memória, enquanto sua API de expressão compõe mais limpo. Tornou-se a recomendação padrão para novo trabalho com dados em 2026.

Instalação

MétodoComando
pippip install polars
uvuv add polars
Com extraspip install "polars[all]" (excel, database, plotting)
Verificarpython -c "import polars as pl; print(pl.__version__)"

Leitura & Escrita

OperaçãoCódigo
CSVpl.read_csv("data.csv")
Parquetpl.read_parquet("data.parquet")
JSONpl.read_json("data.json")
Banco de dadospl.read_database(query, connection)
CSV Lazypl.scan_csv("data.csv") (diferido)
Parquet Lazypl.scan_parquet("*.parquet")
Escritadf.write_parquet("out.parquet")

Eager vs Lazy (a ideia-chave)

import polars as pl

# Eager: executa imediatamente
df = pl.read_csv("sales.csv")
result = df.filter(pl.col("amount") > 100).group_by("region").agg(pl.col("amount").sum())

# Lazy: constrói um plano, otimiza, depois executa em .collect()
result = (
    pl.scan_csv("sales.csv")
      .filter(pl.col("amount") > 100)
      .group_by("region")
      .agg(pl.col("amount").sum())
      .collect()
)

Modo lazy deixa o otimizador empurrar filtros para o scan e ler apenas colunas necessárias — frequentemente um grande speedup em arquivos grandes. Prefira scan_* + .collect() para cargas de trabalho reais.

Expressões (a API central)

ExpressãoFaz
pl.col("x")Referência uma coluna
pl.col("x").sum()Agrega
pl.col("x").alias("y")Renomeia saída
pl.col("*")Todas as colunas
pl.lit(5)Valor literal
pl.when(cond).then(a).otherwise(b)Condicional

Selecionando & Filtrando

TarefaCódigo
Selecionar colunasdf.select("a", "b")
Coluna computadadf.with_columns((pl.col("a") * 2).alias("a2"))
Filtrar linhasdf.filter(pl.col("a") > 10)
Múltiplas condiçõesdf.filter((pl.col("a") > 10) & (pl.col("b") == "x"))
Head/taildf.head(10), df.tail(10)
Ordenardf.sort("a", descending=True)
Únicodf.unique(subset=["a"])

Agregação & Agrupamento

(df.group_by("region")
   .agg(
       pl.col("amount").sum().alias("total"),
       pl.col("amount").mean().alias("avg"),
       pl.col("order_id").n_unique().alias("orders"),
   ))
AgregaçãoExpressão
Sum/mean/min/max.sum(), .mean(), .min(), .max()
Contagem.count(), .n_unique()
Primeiro/último.first(), .last()
Quantil.quantile(0.95)
Coletar lista.implode()

Joins

TipoCódigo
Innera.join(b, on="id")
Esquerdaa.join(b, on="id", how="left")
Completoa.join(b, on="id", how="full")
Antia.join(b, on="id", how="anti")
Semia.join(b, on="id", how="semi")
As-of (tempo)a.join_asof(b, on="ts")

Strings, Datas, Listas

NamespaceExemplo
.strpl.col("s").str.to_uppercase(), .str.contains("x")
.dtpl.col("t").dt.year(), .dt.truncate("1h")
.listpl.col("l").list.len(), .list.first()
.castpl.col("a").cast(pl.Int64)

Interop

AlvoCódigo
pandasdf.to_pandas() / pl.from_pandas(pdf)
Arrowdf.to_arrow()
NumPydf.to_numpy()
DuckDBConsultar frames Polars diretamente de DuckDB

Polars vs pandas

AspectoPolarspandas
MotorRust, multi-threadedPython/C, principalmente single-threaded
MemóriaArrow columnarNumPy-backed
Otimizador lazySimNão
APIBaseada em expressão, componívelBaseada em índice
EcossistemaCrescendo rápidoVasto, maduro

Para análise SQL-first sobre arquivos, combine com DuckDB; pandas permanece valioso por sua amplitude de ecossistema.

Recursos