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étodo | Comando |
|---|
| pip | pip install polars |
| uv | uv add polars |
| Con extras | pip install "polars[all]" (excel, base de datos, gráficos) |
| Verificar | python -c "import polars as pl; print(pl.__version__)" |
Lectura y escritura
| Operación | Código |
|---|
| CSV | pl.read_csv("data.csv") |
| Parquet | pl.read_parquet("data.parquet") |
| JSON | pl.read_json("data.json") |
| Base de datos | pl.read_database(query, connection) |
| CSV perezoso | pl.scan_csv("data.csv") (diferido) |
| Parquet perezoso | pl.scan_parquet("*.parquet") |
| Escribir | df.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ón | Hace |
|---|
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
| Tarea | Código |
|---|
| Selecciona columnas | df.select("a", "b") |
| Columna computada | df.with_columns((pl.col("a") * 2).alias("a2")) |
| Filtra filas | df.filter(pl.col("a") > 10) |
| Múltiples condiciones | df.filter((pl.col("a") > 10) & (pl.col("b") == "x")) |
| Cabeza/cola | df.head(10), df.tail(10) |
| Ordena | df.sort("a", descending=True) |
| Único | df.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ón | Expresió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
| Tipo | Código |
|---|
| Interior | a.join(b, on="id") |
| Izquierda | a.join(b, on="id", how="left") |
| Exterior | a.join(b, on="id", how="full") |
| Anti | a.join(b, on="id", how="anti") |
| Semi | a.join(b, on="id", how="semi") |
| Como-de (tiempo) | a.join_asof(b, on="ts") |
Cadenas, fechas, listas
| Espacio de nombres | Ejemplo |
|---|
.str | pl.col("s").str.to_uppercase(), .str.contains("x") |
.dt | pl.col("t").dt.year(), .dt.truncate("1h") |
.list | pl.col("l").list.len(), .list.first() |
.cast | pl.col("a").cast(pl.Int64) |
Interoperabilidad
| Objetivo | Código |
|---|
| pandas | df.to_pandas() / pl.from_pandas(pdf) |
| Arrow | df.to_arrow() |
| NumPy | df.to_numpy() |
| DuckDB | Consulta marcos Polars directamente desde DuckDB |
Polars vs pandas
| Aspecto | Polars | pandas |
|---|
| Motor | Rust, multi-hilos | Python/C, principalmente mono-hilos |
| Memoria | Columnar de Arrow | Respaldada por NumPy |
| Optimizador perezoso | Sí | No |
| API | Basada en expresión, componible | Índice-céntrica |
| Ecosistema | Creciendo rápido | Vasto, maduro |
Para análisis primero por SQL sobre archivos, empareja con DuckDB; pandas sigue siendo valioso por su amplitud de ecosistema.
Recursos