Pythonでデータを扱う勉強を始めると、まずpandasという名前に出会います。表形式のデータを読み込んで、絞り込んで、集計する。あの道具です。
ところが最近、検索していると別の名前が並んで出てくるようになりました。Polarsです。
せっかくpandasを覚えかけているのに、また新しいものを覚え直すのか。そう感じてしまう気持ちは、とてもよく分かります。
この記事では、Polarsが何者で、pandasと何が違い、いま学ぶ必要があるのかどうかを、順番にほどいていきます。
そもそも、なぜ別のライブラリが生まれたのか¶
pandasは2008年から続く定番で、いまも現役です。学習教材も日本語の情報も、圧倒的にpandasのほうが多くあります。
では、なぜ新しいものが必要になったのでしょうか。理由は、データの量が当時の想定を超えて増えたからです。
pandasが設計された頃、パソコンのCPUは今ほどコアの数が多くありませんでした。そのため処理の多くが、1本の流れで順番に進む作りになっています。
一方、いま手元にあるパソコンは4コアや8コアが当たり前です。8つある作業台のうち1つしか使っていない状態が、pandasの標準的な動き方になってしまったわけです。
この差を埋めるために、設計からやり直して作られたのがPolarsです。pandasの改良版ではなく、別物として生まれた点がポイントになります。
pandas自体をまだ触ったことがないなら、先にそちらの感覚をつかんでおくと、この記事の話がずっと入りやすくなります。【関連記事】pandas入門 データ処理をやってみよう
Polarsの正体は、Rustで書かれた処理エンジン¶
Polarsは公式に、DataFrameのための分析クエリエンジンと名乗っています。少し硬い表現ですが、要するに表データを高速に処理するための土台です。
ここで大事なのは、中身がPythonで書かれていないことです。Rustという言語で、ゼロから作られています。
私たちが書くのはPythonのコードですが、実際の計算はRust側で行われます。Pythonは指示を出す係、Rustは働く係、という分担だと思ってください。
この構造は、実はNumPyやpandasの内部と考え方が似ています。速い部分を別の言語に任せる、という発想は前からありました。
複数のCPUコアを最初から使う¶
Polarsの説明でよく出てくるのが、マルチスレッドという言葉です。公式リポジトリでも、マルチスレッドかつベクトル化された実行と書かれています。
これは、ひとつの処理を複数のCPUコアに分けて同時に走らせるという意味です。特別な設定をしなくても、標準でそう動きます。
たとえば100万行のデータから条件に合う行を探すとき、行を分担して同時に調べる。だから待ち時間が短くなる、という仕組みです。
Apache Arrowという共通の置き場所¶
もうひとつの特徴が、Apache Arrowという形式でデータをメモリに置いている点です。列ごとにまとめて並べる、列指向と呼ばれる持ち方をします。
売上の合計を出すような集計では、売上の列だけをまとめて読めば済みます。列ごとに並んでいると、この読み方が素直に速くなるわけです。
さらにArrowは共通仕様なので、対応する他のツールとデータを渡すときにコピーを作らずに済みます。ここも地味に効いてきます。
インストールと、いまのバージョン事情¶
説明を読むより手元で動かしたほうが早いはずです。準備はコマンド1行で終わります。
python -m venv venv
source venv/bin/activate
pip install polars
執筆時点の最新版は1.44.1で、2026年8月26日に公開されました。動作にはPython 3.10以降が必要です。
比較のために、pandasの状況も並べておきます。数字は執筆時点のものです。
| 項目 | Polars | pandas |
|---|---|---|
| 最新の公開版 | 1.44.1(2026年8月26日) | 3.0.5 |
| 必要なPython | 3.10以降 | 3.11以降 |
| 中身を書いている言語 | Rust | PythonとC(Cython) |
| ライセンス | MIT | BSD 3-Clause |
| 対応する言語 | Python、Rust、Node.js、R、SQL | Python |
仮想環境を分けずにいろいろ入れると、あとでバージョンの衝突に悩まされます。venvの使い方が曖昧なままなら、先に整理しておくと安全です。【関連記事】Pythonの仮想環境(venv)って何のためにある?プロジェクトごとに混ぜない管理法
最初の一本を書いてみる¶
ここからは実際のコードです。ファイルを用意しなくても動くように、表そのものをコードの中で作ります。
import polars as pl
df = pl.DataFrame(
{
"商品": ["りんご", "みかん", "りんご", "ぶどう"],
"店舗": ["東京", "東京", "大阪", "大阪"],
"売上": [1200, 800, 1500, 2000],
}
)
print(df)
result = (
df.filter(pl.col("売上") >= 1000)
.group_by("商品")
.agg(pl.col("売上").sum().alias("売上合計"))
.sort("売上合計", descending=True)
)
print(result)
やっていることは、売上が1000以上の行だけ残し、商品ごとに合計を出し、大きい順に並べる、という流れです。上から下へ読めば、そのまま日本語の説明になります。
目を引くのはpl.col("売上")という書き方でしょう。これは売上という列を指す式で、Polarsでは式(expression)と呼ばれます。
pandasに慣れているとdf["売上"]と書きたくなりますが、Polarsではまず式を組み立てて、それをfilterやaggに渡します。この式という考え方が、Polarsを理解するうえで最初の関門であり、最大のごほうびでもあります。
式は独立した部品なので、Polars側でまとめて解析し、同時に実行できる部分を見つけられます。速さの理由の一部は、ここにあります。
pandasとの書き方の違いを表で見る¶
とはいえ、書き方が違うと言われても実感が湧きにくいはずです。公式の移行ガイドにある対応関係を、代表的なものだけ並べます。
| やりたいこと | pandas | Polars |
|---|---|---|
| 列を1つ取り出す | df["a"] |
df.select("a") |
| 条件で行を絞る | df[df["price"] < 300] |
df.filter(pl.col("price") < 300) |
| 列を追加する | df.assign(x=df["v"] * 10) |
df.with_columns(x=pl.col("v") * 10) |
| 行の指し方 | index(.loc / .iloc) |
上から数えた整数の位置だけ |
| 実行のタイミング | その場ですぐ | すぐにも、あとからにもできる |
indexが無い、という最大の戸惑い¶
pandasで一番混乱しやすいのが、行に付いてくるindexという番号やラベルでした。Polarsには、これがありません。
公式ドキュメントでも、Polarsはindexを使わず、各行は表の中の整数の位置で示されると明記されています。だから.locも.ilocも存在しません。
最初は物足りなく感じるかもしれません。ただ、indexがずれて集計結果が狂うという事故が起きなくなるので、慣れると気が楽です。
列を足すときはwith_columns¶
もうひとつ戸惑うのが、列の追加です。pandasのようにdf["新しい列"] = ...と代入する書き方はしません。
代わりにwith_columnsで、新しい列を含んだ表を作り直します。元の表を書き換えるのではなく、新しい表が返ってくる形です。
この作り方だと、途中の状態がどこかで書き換わっている心配がありません。処理を追いかけやすくなる、という利点があります。
遅延実行という、もうひとつの武器¶
Polarsにはもうひとつ、pandasに無い仕組みがあります。遅延実行、英語ではlazyと呼ばれるものです。
これは、書いた処理をすぐには走らせず、いったん設計図として貯めておく方式です。最後に実行を指示した時点で、Polarsが全体を見渡して無駄を省いてから動きます。
大きなCSVファイルを扱う場面のコードを見てみましょう。読み込みの関数名がread_csvではなくscan_csvになっている点に注目してください。
import polars as pl
q = (
pl.scan_csv("sales.csv")
.filter(pl.col("status") == "shipped")
.group_by("customer_id")
.agg(
pl.col("amount").sum().alias("total"),
pl.len().alias("n_orders"),
)
.sort("total", descending=True)
)
df = q.collect()
print(df.head())
collect()を呼ぶまで、ファイルは本格的に読まれません。そして実行時には、条件に合う行だけを読み込む、といった判断が自動で入ります。
私は10年ほどエンジニアとして開発に関わってきましたが、深夜の集計バッチがメモリ不足で落ちる事故には何度も付き合ってきました。原因はたいてい、巨大なCSVをまるごと読み込んでから絞り込んでいたことです。
当時は自前で分割読み込みを書いて凌ぎましたが、その手間をライブラリ側が引き受けてくれるのが遅延実行の価値だと感じています。必要な分だけ読む、という当たり前の工夫を、書き手が意識しなくてよくなるのが大きいわけです。
さらにPolarsには、メモリに乗り切らないデータを少しずつ処理するストリーミングエンジンも備わっています。これも公式リポジトリに機能として明記されています。
それで、今から乗り換えるべきなのか¶
ここまで読むと、Polarsのほうが良さそうに見えるかもしれません。ただ、学習中の方への私の答えは、少し慎重なものになります。
結論から言えば、pandasを捨てる必要はありません。学習の教材、書籍、そして仕事で出会うコードの多くは、まだpandasで書かれています。
判断の目安を整理しておきます。自分がどの状況にいるかを当てはめてみてください。
| 状況 | おすすめ |
|---|---|
| Pythonの基礎を学んでいる最中 | まずpandasで表データの感覚をつかむ |
| 数万行までのデータを扱う | pandasで十分。速さの差は体感しにくい |
| 数百万行のCSVで処理が重い | Polarsを試す価値が大きい |
| チームや教材がpandas前提 | 合わせる。学習コストのほうが高くつく |
| 新しく分析用のツールを作る | 最初からPolarsを選ぶ手もある |
実務でも、動いているpandasのコードを丸ごと書き換えるのは慎重に判断したほうがいいと考えています。遅くて困っている処理だけを差し替えるほうが、失敗したときの傷が浅く済みます。
なお、PolarsもCSVの読み書きはできますが、文字コードの落とし穴はどちらのライブラリでも同じように待ち構えています。心当たりがあるなら先に確認しておくと安心です。【関連記事】Pythonのcsvモジュールとは?表データの読み書きと文字化けの防ぎ方を初心者向けに解説
つまずきやすいところと、学び方の順番¶
最後に、実際に触り始めたときに引っかかりやすい点を挙げておきます。どれも知っていれば数分で解決するものばかりです。
ひとつめは、検索で出てくる情報の世代差です。Polarsは変化が速く、古い記事には現在と違う書き方が残っています。
たとえば集計の関数名は、以前と今とで表記が変わった経緯があります。動かないコードに出会ったら、まず公式のリファレンスを引くのが近道です。
ふたつめは、グラフを描く場面です。Polarsは表を扱う道具なので、可視化そのものは別のライブラリに任せます。
描画まで進めたいなら、matplotlibの使い方を先に押さえておくと流れが途切れません。【関連記事】Pythonのmatplotlibとは?データをグラフにして見せる基本を初心者向けに解説
みっつめは、そもそもの土台の話です。表データの計算が速くなる理屈は、配列をまとめて計算するという発想に根があります。
その感覚はNumPyを触ると腹落ちしやすいので、遠回りに見えて実は近道です。【関連記事】PythonのNumPyとは?配列計算がリストより速くなる仕組みを初心者向けに解説
まとめ¶
Polarsは、Rustで書かれた新しいデータ処理の土台です。複数のCPUコアを標準で使い、Apache Arrowの形式でデータを持ち、遅延実行で無駄な読み込みを減らします。
pandasとは書き方が違いますが、覚え直しというより、考え方を1つ足す作業に近いものです。indexが無いことと、式を組み立ててから渡すこと。この2点さえ飲み込めば、あとは表を見ながら書けます。
急いで乗り換える必要はありません。手元のデータが大きくなって処理が重いと感じたとき、そこがPolarsを試す合図です。
まずは今日のコードをそのまま貼り付けて、動く様子を眺めるところから始めてみてください。速さの話は、体感してからのほうが納得できるはずです。
参考情報¶
- pola-rs/polars — Polars公式リポジトリ(README・機能一覧)
- polars — PyPI(最新バージョンと対応Python)
- Coming from pandas — Polars公式の移行ガイド(ドキュメント原文)
- pandas — PyPI(最新バージョンと対応Python)
ここまでお読みいただきありがとうございました。