Pandasは10年以上にわたり,Pythonデータ分析のデファクトスタンダードであり続けてきた。2026年現在も広く使われているが,もはや「迷わずPandas」とは言えない状況だ。新世代のライブラリが,大幅なパフォーマンス向上,メモリ効率の改善,より直感的なAPIを提供している。

本記事では主要な選択肢を比較し,ユースケースごとに最適なライブラリを検討する。

主要ライブラリ一覧

ライブラリ成熟度実装言語主な強み
Pandas 2.2成熟C/Pythonエコシステム,普及度
Polars 1.x安定Rust速度,メモリ効率
DuckDB 1.x安定C++SQLインターフェース,ゼロコピー
Modin安定PythonPandasのドロップイン代替
VaexメンテナンスモードC++/Pythonアウトオブコア処理
DataFusion (Python)成長中RustApache Arrowネイティブ

パフォーマンス:ベンチマークが示す事実

数字を捏造するのではなく,公式および第三者ベンチマークの結果を紹介する。

Polars PDS-H ベンチマーク(TPC-H派生)

PolarsチームはTPC-H意思決定支援ベンチマークに基づくオープンソースのベンチマークスイート PDS-H を公開している。最新の結果(2025年5月)では,標準的な分析クエリでPolarsと他のエンジンを比較している。

主な結果:

  • PolarsはTPC-H派生の全22クエリで一貫してPandasを大差で上回る
  • 同等の操作において,PolarsはPandasよりも大幅にメモリ使用量が少ない
  • ベンチマークはGitHubでオープンソース公開されており,再現可能

エネルギー・パフォーマンス調査

別のPolarsエネルギーベンチマーク調査では,大規模DataFrameを用いた合成データ分析タスクにおいて PolarsはPandasの約8分の1のエネルギー消費 であり,大規模データセットのTPC-Hスタイルクエリでは Pandasが必要とするエネルギーの約63% で処理できることが示された。

全体的なパフォーマンス傾向

公開ベンチマークおよびコミュニティの報告に基づく:

  • PolarsとDuckDB は,特に100万行以上のデータセットにおいて,ほとんどの分析操作でPandasより大幅に高速
  • DuckDB は集約・結合が多いワークロードで特に優秀
  • Modin はPandasに対して控えめな速度向上を提供するが,メモリ使用量は増加する
  • Pandas 2.xのArrowバックエンドdtype はPandas 1.xより明確に高速

注:正確なパフォーマンス比率はハードウェア,データ形状,クエリの複雑さに大きく依存する。実際のワークロードで必ずベンチマークを取ること。


Polars — パフォーマンス重視の新しいデフォルト

パフォーマンスが重要な新規プロジェクトにおいて,PolarsはPandasに代わる最有力な選択肢 となっている。

import polars as pl

df = pl.read_parquet("events.parquet")

result = (
    df.lazy()
    .filter(pl.col("event_type") == "purchase")
    .group_by("user_id")
    .agg([
        pl.col("amount").sum().alias("total_spent"),
        pl.col("amount").count().alias("num_purchases"),
    ])
    .sort("total_spent", descending=True)
    .head(100)
    .collect()
)

Polarsが選ばれる理由:

  • ほとんどの操作でPandasより大幅に高速 — PDS-H公式ベンチマークで確認済み(出典
  • 遅延評価 により,実行前にクエリプランを最適化。冒頭で.lazy(),末尾で.collect()を書くだけで,最大のパフォーマンス最適化が得られる
  • 一貫したAPI で,Pandasの落とし穴(SettingWithCopyWarningなど)を回避
  • Rust実装 による適切な並列処理 — デフォルトで全コアを活用

正直なデメリット:

  • エコシステムのギャップ:多くのライブラリがまだPandas DataFrameを前提としている。.to_pandas()による変換が避けられない場面もある
  • プロット連携が弱い — Matplotlib/SeabornはPandasの入力を前提としている
  • APIの違いが大きく,実際に学習コストがかかる。Pandas経験者のチームでも移行に約1週間は見込むべき

DuckDB — SQLで分析したいときの最適解

DuckDBはDataFrameライブラリではなく,組み込み型の分析データベースだ。しかし,Pythonでデータを分析する最良の方法の一つとなっている。

import duckdb

result = duckdb.sql("""
    SELECT 
        user_id,
        SUM(amount) as total_spent,
        COUNT(*) as num_purchases
    FROM read_parquet('events.parquet')
    WHERE event_type = 'purchase'
    GROUP BY user_id
    ORDER BY total_spent DESC
    LIMIT 100
""").fetchdf()

DuckDBの魅力:

  • 優れた集約パフォーマンス — groupbyや結合操作でPolarsと同等以上の速度
  • ゼロコピー統合 — Pandas,Polars,ArrowのデータをコピーなしでSQLクエリから参照可能
  • Parquet,CSV,JSONを直接読み取り — 明示的なロードステップ不要
  • 組み込み型 — サーバー不要,セットアップ不要,pip install duckdbだけ

PolarsよりDuckDBを選ぶべき場面:

  • チームがメソッドチェーンよりSQLに慣れている
  • パイプラインを構築せずファイルを直接クエリしたい
  • 異なるフォーマット(CSV + Parquet + JSON)をまたいで結合したい

DuckDBよりPolarsが適する場面:

  • 複雑な多段階変換(メソッドチェーンの方がネストしたSQLより可読性が高い)
  • Pythonコードでデータパイプラインを構築する
  • 実行の細かい制御が必要な場合

Pandas 2.2 — まだ現役(ただし条件付き)

Pandasは終わっていない。2.xのArrowバックエンドdtypeにより,1.xと比べて大幅に高速化されている:

import pandas as pd

# Arrowバックエンドでパフォーマンス向上
df = pd.read_parquet("events.parquet", dtype_backend="pyarrow")

Pandasを選ぶべき場面:

  • チームがすでに習熟しており,パフォーマンスが十分な場合
  • ライブラリ互換性を最大限確保したい場合(scikit-learn,statsmodelsなど)
  • 小規模データセット(100万行未満)でパフォーマンス差が無視できる場合
  • Jupyterノートブックでの探索的分析

代替を検討すべき場面:

  • データセットが利用可能なRAMを超える場合
  • パフォーマンスが重要な本番データパイプラインの構築
  • 1000万行以上のデータセットを日常的に扱う場合

Modin — 積極的には推奨しにくい

Modinはimport文を1行変えるだけでPandasを高速化すると謳っている。しかし実際には,トレードオフが大きい:

  • Pandas自体よりメモリ使用量が多い(データをプロセス間で分散するため)
  • API対応が不完全 — 一部の操作はサイレントにPandasにフォールバックする
  • 起動オーバーヘッド により,小規模データセットではむしろ遅くなる
  • 分散実行で問題が発生した際のデバッグが複雑

評価: ほとんどのチームにとって,互換性を重視するならPandasを継続し,パフォーマンスを重視するならPolarsに移行する方が良い。Modinはどちらの目標も十分に達成できない中途半端な立ち位置にある。


選択フレームワーク

データが100万行未満?
  → Pandas(Arrowバックエンドdtype使用)で十分。深く考える必要はない。

チームはSQL派?
  → DuckDB。

Pythonデータパイプラインを構築する?
  → Polars。

ファイルをロードせずにクエリしたい?
  → DuckDB。

単一マシンで1億行以上?
  → Polars(lazyモード)またはDuckDB。

データが利用可能RAMを超える?
  → DuckDBまたはPolars(ストリーミングモード)。

参考リンク

Pandasからの移行について質問があれば,[email protected] までお気軽にどうぞ。