Polars公式が、pandasからPolarsへの移行戦略を3つに整理した記事を公開した。区間ごとに移す手順を整理しつつ、AIに任せれば片付くのかという疑問についても筆者の見解を述べる。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
pandas(パンダス)もPolars(ポーラーズ)も、Pythonで表形式のデータ(Excelの表のようなもの)を扱うためのライブラリだ。pandasは10年以上使われてきた定番であり、Polarsは後発で、Rust製で高速なことを売りにしている。速いことは知っている。将来的にはそちらが主流になりそうだということも、なんとなく分かっている。それでも、目の前の仕事はpandasで書いてしまう。既存のコードがpandasで書かれていて、身に付いたスキルもpandasで、そしてAIに書かせても出てくるのはpandasだからである。
この停滞に、どこから手を付ければよいのか。その問いに正面から答える記事が、2026年8月6日にPolars公式ブログで公開された。筆者はPolarsのThijs Nieuwdorp氏。新機能の発表ではなく、既にpandasで書かれた資産をどう移すかという、きわめて実務的な内容である。しかも記事は、意外なことに「全部書き換えろ」とは言っていない。
pandasからPolarsへの3つの移行戦略(記事の内容を基に筆者がAIで作成)意外に思えるかもしれないが、この記事は全面移行を勧めていない。よくテストされていて、めったに変更されず、信頼性・メモリ・コストのどれにも問題がないパイプラインは、そのままでよいと明言している。Polars非対応の独自ライブラリに依存している場合や、厳格な変更管理下にあって再検証の手間が翻訳作業より重い場合も同様だ。
つまり移行の判断基準は「Polarsが新しいから」ではなく、名指しできる問題があるかどうかに置かれている。メモリ不足で落ちるジョブや、高価なマシンが必要になったジョブがそれに当たる。
実例として、Check Technologiesが100超のAirflow DAG(処理の流れを定義したもの)を2週間弱で移行してクラウド費用を25%削減した件と、Rabobankがコードベースの中核を作り直して性能が30倍になった件が挙げられている。
――3つの戦略のうち一つは、移行そのものをLLM(大規模言語モデル)に任せるというものだ。ならば、AIに投げれば片付くのだろうか。ここで『Deep Insider Brief』恒例の“ひと言コメント”として、筆者なりの見解を述べたい。その後で、具体的な移行手順を整理していく。
Deep Insider編集長の一色です。こんにちは。
白状すると、私自身はついpandasで書いてしまいますが、指示しなければAIもpandasを書きますよね。これは恐らく、AIの学習データの量が10年分以上違うからだと思います。AIという最強のコード生成手段が、いまもpandasを書き続けている、というのが2026年の実情ではないでしょうか。
ただし、これは言い訳になりません。Polarsが2026年6月に公開した検証では、Claude Opus 4.8にpandasのコード33件をワンショットでPolarsに翻訳させたところ31件が正しく動き、Claude Sonnet 4.6では33件全ての出力が一致しました。1年前は非推奨メソッドを使って動かないコードを出していたことを思えば、状況は変わっています。システムプロンプトに「PolarsをデフォルトのDataFrameライブラリとして使う」と1行書けば済む話でもあります。
では、AIに投げれば片付くのか。片付かない部分が1つ残ります。翻訳である以上、AIは元のpandasの段取りを引きずるのです。集計用の別テーブルを作ってから結合し直す、といった組み立てが、最新の正しいPolars APIのまま再現される。メソッドは古くない。手順の設計がpandasのままなのです。
厄介なのは、それが動くし、結果も正しいことです。エラーも警告も出ません。LLMに修復ループを回させられるのは、正しさにはassert_frame_equalという自動判定があるからでした。しかし訛(なま)りは何も落とさない。つまり、自動修復ループの外側にある問題です。しかもこの訛りはAI固有ではなく、pandas歴の長い開発者も同じパターンを持ち込むと記事は指摘しています。
ここから私の意見です。移行戦略を考える前に、新規案件をPolarsで書くべきだと思います。既存資産の移行は問題が出てから着手すればよい。しかし「これはPolarsらしい書き方かどうか」を判定する目は、問題が出てからでは間に合いません。そして翻訳するかぎり元の構造を引きずるのなら、ゼロから書く新規開発こそが、引きずる元のない唯一の練習場です。
なお、この検証はPolars社自身によるもので、記事も「1ケース1回の小規模な実験であり、ベンチマークではなく方向性を示す信号として扱ってほしい」と断っています。数字は割り引いて読むべきでしょう。
正直に言えば、私自身まだPolarsを使いこなせていません。だからこそ、次の新規案件はPolarsで組むところから始めようと思っています。
それでは、記事が示す具体的な移行ノウハウを整理してみよう。
3つの戦略はどれも、同じ土台の上に立っている。パイプライン全体を一気に書き換えるのではなく、変換処理のまとまり(セグメント=区間)に分け、1区間ずつ移す。
区間ごとに移していく手順(記事の内容を基に筆者が作成)pandasからPolarsに変換して処理し、次の処理がpandasを必要とするときだけ戻す。前後の処理には手を触れない。
import polars as pl
def step_2(pandas_df): # 移行した区間
polars_lf = pl.from_pandas(pandas_df).lazy()
query = polars_lf.filter(...).group_by(...).agg(...)
return query.collect().to_pandas(use_pyarrow_extension_array=True)
記事は、翻訳ミスは文法ではなく意味の違いから生じると明言している。コードが間違って見えないまま、結果だけが変わるパターンだ。
記事は、結果を左右するのはモデルの選択よりも仕事の渡し方だとして、次の4点を挙げている。
LLMの修復ループと、その外側に残るもの(記事の内容を基に筆者が作成)Copyright© Digital Advantage Corp. All Rights Reserved.