はじめに
データサイエンスの分野では、表形式のデータ処理が欠かせない作業の一つとなります。これまで「Pandas」が広く使われてきましたが、最近はRustで開発された「Polars」というライブラリが注目を集めています。
Polarsは、その高速な処理能力とメモリ効率の良さで、特に大規模データに対して優れたパフォーマンスを発揮することが特徴です。
本記事では、Polarsの性能をPandas比較し、使いやすいさを検証してみます。
PolarsやPandasはテーブル処理には不可欠な技術となります。これらについて理解が難しい場合は、経験豊富な方とマンツーマンで学習していくのもオススメです。
Polarsとは
Polarsは、Rustというプログラミング言語で開発されたデータフレームライブラリで、高いパフォーマンスを引き出します。
さらに、Polarsは並列処理を活用することで、マルチコア環境でも効率的に動作し、大規模データに対しても高速な処理が可能です。
Polarsサイトにはベネフィットとして以下の3つが書かれています。
- Fast:Polars is written from the ground up with performance in mind. Its multi-threaded query engine is written in Rust and designed for effective parallelism. Its vectorized and columnar processing enables cache-coherent algorithms and high performance on modern processors.。
- Easy to use:You will feel right at home with Polars if you are familiar with data wrangling. Its expressions are intuitive and empower you to write code which is readable and performant at the same time.
- Open source:Polars is and always will be open source. Driven by an active community of developers, everyone is encouraged to add new features and contribute. Polars is free to use under the MIT license.
引用:Polars
高速で、誰でも使いやすいオープンソースのライブラリとして活用できるということになります。公式にはPandasの30倍程度の速さを計測したとのことも書いてあります。
PolarsとPandasを比較してみる
今回はKaggleのコンペティションのデータを使ってみました。
UM – Game-Playing Strength of MCTS Variantsのtrainデータを使ってみます。1.22GBで行, 列が(233234, 814)あります。
Polarsはversion1.13.1、Pandasはversion2.2.3を使います。
PCスペックはプロセッサがAMD Ryzen 7 5825U with Radeon Graphics、RAMは16GBを使います。
データ読み込み
まずはデータを読み込みます。
%%timeit -r 7 -n 5
df = pl.read_csv("../input/kaggle_train.csv") # Polars
%%timeit -r 7 -n 5
df = pd.read_csv("../input/kaggle_train.csv") # Pandas
| Polars | Pandas | |
| 実行時間 | 1.27 s ± 115 ms | 11.5 s ± 450 ms |
Polarsの方が10倍近く速くなりました。こちらのデータは少し重いのですが、Polarsはすぐ読み込むことができたため、ストレスなく分析できそうです。
逆にPandasだと11.5 sという結果だったので、毎回読み込むと相当なストレスになると感じました。
欠損値埋め
欠損値を埋める処理を試してみます。
%%timeit -r 7 -n 5
filled_df = df.fill_null(0) # Polars
%%timeit -r 7 -n 5
filled_df = df.fillna(0) # Pandas
| Polars | Pandas | |
| 実行時間 | 221 ms ± 8.26 ms | 443 ms ± 27.1 ms |
Polarsの方が2倍近く速くなりました。しかし、どちらも速いので全く気になりませんでした。
Group集計
Group集計を試してみます。
%%timeit -r 7 -n 5
grouped_df = df.group_by("GameRulesetName").agg(pl.col("utility_agent1").mean()) # Polars
%%timeit -r 7 -n 5
grouped_df = df.groupby("GameRulesetName")["utility_agent1"].mean().reset_index() # Pandas
| Polars | Pandas | |
| 実行時間 | 413 ms ± 11.1 ms | 17.6 ms ± 792 µs |
この場合は、Pandasの方がだいぶ速くなりました。しかし、どちらも速いので全く気になりませんでした。
PolarsとPandasの比較結果
今回試した結果では、2勝1敗でPolarsの勝ちになりました。他の記事でも、処理によってはPandasの方が速いというのも見られたので、どちらを使うかは試したうえで使うのもいいかもしれません。
ただ今回のデータを用いた読み込みについてはPandasが相当遅くストレスになったので、Pandas読み込みで遅いときはPolarsに切り替えるのもいいと思います。
PolarsとPandasの書き方まとめ
PolarsとPandasでは書き方が違うため、いくつか例を挙げます。こちらを用いて変換などを操作をしながら試していくのがいいと思います。
CSVの読み込み
# CSVファイルの読み込み
df = pl.read_csv("sample_data.csv") # Polars
df = pd.read_csv("sample_data.csv") # Pandas
Group集計
# category列でグループ化し、value列の合計を計算
grouped_df = df.group_by("category").agg(pl.col("value").sum()) # Polars
grouped_df = df.groupby("category")["value"].sum().reset_index() # Pandas
行の条件抽出
# value列が10以上の行を抽出
filtered_df = df.filter(pl.col("value") >= 10) # Polars
filtered_df = df[df["value"] >= 10] # Pandas
列同士の計算
# 新しい列totalを追加し、value列とquantity列の積を計算
df = df.with_columns((pl.col("value") * pl.col("quantity")).alias("total")) # Polars
df["total"] = df["value"] * df["quantity"] # Pandas
列選択
# 特定の列(categoryとvalue)だけを選択
selected_df = df.select(["category", "value"]) # Polars
selected_df = df[["category", "value"]] # Pandas
ソート
# value列で昇順にソート
sorted_df = df.sort("value") # Polars
sorted_df = df.sort_values("value") # Pandas
型確認
# データ型の確認
print(df.schema) # Polars
print(df.dtypes) # Pandas
まとめ
PolarsとPandasはどちらもデータフレーム操作に活用するライブラリです。今回は処理が速いと噂のPolarsを試して、処理速度を試してみました。
Polarsの方が速いこともあればPandasが速いこともあったため状況に応じて使い分けるのが良さそうです。
Polarsを学ぶのにオススメの方法
書籍:Polarsとpandasで学ぶ データ処理アイデアレシピ55
Polarsを体系的に学びたい方には以下の書籍がオススメです。pandasとの比較や使い分けも丁寧に解説されており、現場で役立つ55のレシピが収録されています。
スクール:現役データサイエンティストに教えてもらう
Polarsに限らず、Pandasなども含めデータの前処理は非常に重要です。相談しながら進められるスクールもオススメです。




コメント