Polars - 高速 DataFrame ライブラリ チートシート
Polarsは Rust で書かれた高性能のDataFrame ライブラリで、Python、R、Node バインディングを持つ。デフォルトではマルチスレッド、Apache Arrow列メモリ上に構築され、クエリ オプティマイザを持つ遅延APIを提供する。大規模データセットでは通常、pandas より何倍も高速で、メモリを使用しながら、その式API はより明確に構成される。2026年の新しいデータ作業のデフォルト推奨になった。
インストール
| 方法 | コマンド |
|---|
| pip | pip install polars |
| uv | uv add polars |
| エクストラ付き | pip install "polars[all]" (excel、database、plotting) |
| 確認 | python -c "import polars as pl; print(pl.__version__)" |
読み込みと書き込み
| 操作 | コード |
|---|
| CSV | pl.read_csv("data.csv") |
| Parquet | pl.read_parquet("data.parquet") |
| JSON | pl.read_json("data.json") |
| データベース | pl.read_database(query, connection) |
| 遅延 CSV | pl.scan_csv("data.csv") (遅延) |
| 遅延 Parquet | pl.scan_parquet("*.parquet") |
| 書き込み | df.write_parquet("out.parquet") |
イーガー vs 遅延 (鍵となるアイデア)
import polars as pl
# イーガー:すぐに実行
df = pl.read_csv("sales.csv")
result = df.filter(pl.col("amount") > 100).group_by("region").agg(pl.col("amount").sum())
# 遅延:計画を構築し、最適化してから .collect() で実行
result = (
pl.scan_csv("sales.csv")
.filter(pl.col("amount") > 100)
.group_by("region")
.agg(pl.col("amount").sum())
.collect()
)
遅延モードにより、オプティマイザがフィルタをスキャンに下げ、必要な列のみを読み込むことができる — 大きなファイルで大きなスピードアップ。実際のワークロードのために scan_* + .collect() を選択。
式 (コアAPI)
| 式 | 行うこと |
|---|
pl.col("x") | 列を参照 |
pl.col("x").sum() | 集約 |
pl.col("x").alias("y") | 出力を名前変更 |
pl.col("*") | すべての列 |
pl.lit(5) | リテラル値 |
pl.when(cond).then(a).otherwise(b) | 条件付き |
選択とフィルタリング
| タスク | コード |
|---|
| 列を選択 | df.select("a", "b") |
| 計算列 | df.with_columns((pl.col("a") * 2).alias("a2")) |
| 行をフィルター | df.filter(pl.col("a") > 10) |
| 複数の条件 | df.filter((pl.col("a") > 10) & (pl.col("b") == "x")) |
| Head/tail | df.head(10)、df.tail(10) |
| ソート | df.sort("a", descending=True) |
| ユニーク | df.unique(subset=["a"]) |
集約とグループ化
(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"),
))
| 集約 | 式 |
|---|
| 合計/平均/最小/最大 | .sum()、.mean()、.min()、.max() |
| カウント | .count()、.n_unique() |
| 最初/最後 | .first()、.last() |
| パーセンタイル | .quantile(0.95) |
| リスト収集 | .implode() |
結合
| タイプ | コード |
|---|
| 内部 | a.join(b, on="id") |
| 左 | a.join(b, on="id", how="left") |
| 外側 | a.join(b, on="id", how="full") |
| アンチ | a.join(b, on="id", how="anti") |
| セミ | a.join(b, on="id", how="semi") |
| As-of (時間) | a.join_asof(b, on="ts") |
文字列、日付、リスト
| ネームスペース | 例 |
|---|
.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) |
相互運用性
| ターゲット | コード |
|---|
| pandas | df.to_pandas() / pl.from_pandas(pdf) |
| Arrow | df.to_arrow() |
| NumPy | df.to_numpy() |
| DuckDB | DuckDB から直接 Polars フレームをクエリ |
Polars vs pandas
| 側面 | Polars | pandas |
|---|
| エンジン | Rust、マルチスレッド | Python/C、ほぼ シングルスレッド |
| メモリ | Arrow列 | NumPy-backed |
| 遅延オプティマイザ | はい | いいえ |
| API | 式ベース、構成可能 | インデックス中心 |
| エコシステム | 急速に成長 | 膨大、成熟 |
SQL-最初の分析のためにDuckDBと組み合わせ;pandasはエコシステム幅のために価値が残る。
リソース