Pandasは10年以上にわたり,Pythonデータ分析のデファクトスタンダードであり続けてきた。2026年現在も広く使われているが,もはや「迷わずPandas」とは言えない状況だ。新世代のライブラリが,大幅なパフォーマンス向上,メモリ効率の改善,より直感的なAPIを提供している。
本記事では主要な選択肢を比較し,ユースケースごとに最適なライブラリを検討する。
主要ライブラリ一覧
| ライブラリ | 成熟度 | 実装言語 | 主な強み |
|---|---|---|---|
| Pandas 2.2 | 成熟 | C/Python | エコシステム,普及度 |
| Polars 1.x | 安定 | Rust | 速度,メモリ効率 |
| DuckDB 1.x | 安定 | C++ | SQLインターフェース,ゼロコピー |
| Modin | 安定 | Python | Pandasのドロップイン代替 |
| Vaex | メンテナンスモード | C++/Python | アウトオブコア処理 |
| DataFusion (Python) | 成長中 | Rust | Apache 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(ストリーミングモード)。
参考リンク
- Polars PDS-H ベンチマーク結果(2025年5月)
- Polars エネルギー・パフォーマンス調査
- Polars ベンチマークリポジトリ(GitHub)
- DuckDB ドキュメント
- Pandas 2.x Arrowバックエンド
Pandasからの移行について質問があれば,[email protected] までお気軽にどうぞ。