Aller au contenu

Polars - Guide de la bibliothèque DataFrame rapide

Polars - Guide de la bibliothèque DataFrame rapide

Polars est une bibliothèque DataFrame haute performance écrite en Rust avec des bindings Python, R, et Node. Elle est multi-threadée par défaut, construite sur la mémoire columnar Apache Arrow, et offre une API lazy avec un optimiseur de requête qui réordonne et élague le travail avant exécution. Sur les grands datasets elle est typiquement plusieurs fois plus rapide que pandas et utilise moins de mémoire, tandis que son API expression se compose plus proprement. Elle est devenue la recommandation par défaut pour les nouveaux travaux de data en 2026.

Installation

MéthodeCommande
pippip install polars
uvuv add polars
Avec extraspip install "polars[all]" (excel, database, plotting)
Vérifierpython -c "import polars as pl; print(pl.__version__)"

Lire & écrire

OpérationCode
CSVpl.read_csv("data.csv")
Parquetpl.read_parquet("data.parquet")
JSONpl.read_json("data.json")
Base de donnéespl.read_database(query, connection)
Lazy CSVpl.scan_csv("data.csv") (différé)
Lazy Parquetpl.scan_parquet("*.parquet")
Écriredf.write_parquet("out.parquet")

Eager vs Lazy (l’idée clé)

import polars as pl

# Eager : s'exécute immédiatement
df = pl.read_csv("sales.csv")
result = df.filter(pl.col("amount") > 100).group_by("region").agg(pl.col("amount").sum())

# Lazy : construit un plan, optimise, puis exécute sur .collect()
result = (
    pl.scan_csv("sales.csv")
      .filter(pl.col("amount") > 100)
      .group_by("region")
      .agg(pl.col("amount").sum())
      .collect()
)

Le mode lazy permet à l’optimiseur de pousser les filtres vers le scan et de ne lire que les colonnes nécessaires — souvent une grande accélération sur les gros fichiers. Préférez scan_* + .collect() pour les vrais workloads.

Expressions (l’API core)

ExpressionFait
pl.col("x")Référencer une colonne
pl.col("x").sum()Agréger
pl.col("x").alias("y")Renommer la sortie
pl.col("*")Toutes les colonnes
pl.lit(5)Valeur littérale
pl.when(cond).then(a).otherwise(b)Conditionnel

Sélectionner & filtrer

TâcheCode
Sélectionner des colonnesdf.select("a", "b")
Colonne calculéedf.with_columns((pl.col("a") * 2).alias("a2"))
Filtrer les lignesdf.filter(pl.col("a") > 10)
Plusieurs conditionsdf.filter((pl.col("a") > 10) & (pl.col("b") == "x"))
Head/taildf.head(10), df.tail(10)
Trierdf.sort("a", descending=True)
Uniquedf.unique(subset=["a"])

Agrégation et groupement

(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"),
   ))
AgrégationExpression
Sum/mean/min/max.sum(), .mean(), .min(), .max()
Count.count(), .n_unique()
First/last.first(), .last()
Quantile.quantile(0.95)
List collect.implode()

Joins

TypeCode
Innera.join(b, on="id")
Lefta.join(b, on="id", how="left")
Outera.join(b, on="id", how="full")
Antia.join(b, on="id", how="anti")
Semia.join(b, on="id", how="semi")
As-of (time)a.join_asof(b, on="ts")

Strings, dates, listes

NamespaceExemple
.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

CibleCode
pandasdf.to_pandas() / pl.from_pandas(pdf)
Arrowdf.to_arrow()
NumPydf.to_numpy()
DuckDBInterroger les frames Polars directement depuis DuckDB

Polars vs pandas

AspectPolarspandas
MoteurRust, multi-threadéPython/C, surtout single-threaded
MémoireArrow columnarNumPy-backed
Optimiseur lazyOuiNon
APIExpression-based, composableCentré sur l’index
ÉcosystèmeCroissance rapideVaste, mature

Pour l’analytics SQL-first sur fichiers, associez-la à DuckDB ; pandas reste valide pour la largeur de son écosystème.

Ressources