Ir al contenido

Polars - Biblioteca rápida de DataFrames

Polars - Biblioteca rápida de DataFrames

Polars es una biblioteca de alto rendimiento de DataFrames escrita en Rust con enlaces de Python, R y Node. Es multi-hilos por defecto, construida en memoria columnar de Arrow de Apache, y ofrece una API perezosa con un optimizador de consultas que reordena y poda el trabajo antes de ejecutar. En conjuntos de datos grandes es típicamente muchas veces más rápido que pandas y usa menos memoria, mientras su API de expresión se compone más limpiamente. Se ha convertido en la recomendación por defecto para trabajo de datos nuevo en 2026.

Instalación

MétodoComando
pippip install polars
uvuv add polars
Con extraspip install "polars[all]" (excel, base de datos, gráficos)
Verificarpython -c "import polars as pl; print(pl.__version__)"

Lectura y escritura

OperaciónCódigo
CSVpl.read_csv("data.csv")
Parquetpl.read_parquet("data.parquet")
JSONpl.read_json("data.json")
Base de datospl.read_database(query, connection)
CSV perezosopl.scan_csv("data.csv") (diferido)
Parquet perezosopl.scan_parquet("*.parquet")
Escribirdf.write_parquet("out.parquet")

Ansioso vs Perezoso (la idea clave)

import polars as pl

# Ansioso: se ejecuta inmediatamente
df = pl.read_csv("sales.csv")
result = df.filter(pl.col("amount") > 100).group_by("region").agg(pl.col("amount").sum())

# Perezoso: construye un plan, optimiza, luego ejecuta en .collect()
result = (
    pl.scan_csv("sales.csv")
      .filter(pl.col("amount") > 100)
      .group_by("region")
      .agg(pl.col("amount").sum())
      .collect()
)

El modo perezoso permite al optimizador empujar filtros hacia abajo del escaneo y leer solo columnas necesarias — a menudo una aceleración grande en archivos grandes. Prefiere scan_* + .collect() para cargas de trabajo reales.

Expresiones (la API principal)

ExpresiónHace
pl.col("x")Referencia una columna
pl.col("x").sum()Agrega
pl.col("x").alias("y")Renombra salida
pl.col("*")Todas las columnas
pl.lit(5)Valor literal
pl.when(cond).then(a).otherwise(b)Condicional

Selección y filtrado

TareaCódigo
Selecciona columnasdf.select("a", "b")
Columna computadadf.with_columns((pl.col("a") * 2).alias("a2"))
Filtra filasdf.filter(pl.col("a") > 10)
Múltiples condicionesdf.filter((pl.col("a") > 10) & (pl.col("b") == "x"))
Cabeza/coladf.head(10), df.tail(10)
Ordenadf.sort("a", descending=True)
Únicodf.unique(subset=["a"])

Agregación y agrupación

(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"),
   ))
AgregaciónExpresión
Suma/media/mín/máx.sum(), .mean(), .min(), .max()
Conteo.count(), .n_unique()
Primero/último.first(), .last()
Cuantil.quantile(0.95)
Listar recopilar.implode()

Uniones

TipoCódigo
Interiora.join(b, on="id")
Izquierdaa.join(b, on="id", how="left")
Exteriora.join(b, on="id", how="full")
Antia.join(b, on="id", how="anti")
Semia.join(b, on="id", how="semi")
Como-de (tiempo)a.join_asof(b, on="ts")

Cadenas, fechas, listas

Espacio de nombresEjemplo
.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)

Interoperabilidad

ObjetivoCódigo
pandasdf.to_pandas() / pl.from_pandas(pdf)
Arrowdf.to_arrow()
NumPydf.to_numpy()
DuckDBConsulta marcos Polars directamente desde DuckDB

Polars vs pandas

AspectoPolarspandas
MotorRust, multi-hilosPython/C, principalmente mono-hilos
MemoriaColumnar de ArrowRespaldada por NumPy
Optimizador perezosoNo
APIBasada en expresión, componibleÍndice-céntrica
EcosistemaCreciendo rápidoVasto, maduro

Para análisis primero por SQL sobre archivos, empareja con DuckDB; pandas sigue siendo valioso por su amplitud de ecosistema.

Recursos