Pandas → Polars 早見表
データサイエンスやデータエンジニアリングの分野において、効率的かつ柔軟なデータ処理を実現するためには、適切なツールの選択が不可欠です。最近では、高速かつ省メモリなデータ操作ライブラリであるPolarsが注目を浴びています。本記事では、この新たなライブラリと既存のデータ処理ツールであるPandasとの対応関係を簡潔にまとめます。特に、Polarsへの移行やトライアルをスムーズに進めるために、両ライブラリの使い方に焦点を当てて解説します。
逆引きクックブックのようなイメージです。
本ブログの見方
以下のフォーマットでまとめています。
<処理概要>
< <Pandasコード>
> <Polarsコード>
Pandas
とPolars
のコードがまったく同じ場合は、一行のみ記載しています。
導入
インストール
< pip install pandas
> pip install polars
インポート
< import pandas as pd
> import polars as pl
入力
CSVデータ読み込み
< pd.read_csv("data.csv")
> pl.read_csv("data.csv")
空のデータフレーム作成
< pd.DataFrame()
> pl.DataFrame()
表示
先頭N行を表示
df.head(N)
カラム一覧を表示
df.columns
要約統計量を表示
df.describe()
各列のユニークな行数の表示
Pandas
はすべてのカラムについて計算してくれますが、Polars
は一行ずつ呼び出す必要があります。
< df.nunique()
> df["col"].n_unique()
出力
csvデータ書き出し
注: Polarsにはインデックスがありません。
< df.to_csv("output.csv", index=False)
> df.write_csv("output.csv")
Numpyに変換
df.to_numpy()
辞書に変換
メソッド名は同じto_dict
があります。しかしPolarsにはorient
アーギュメントがなく、Pandasのorient="list"
と同じフォーマットしか出力できません。
< df.to_dict(orient="list")
> df.to_dict(as_series=False)
抽出
指定した列を取り出す
< df[["col1", "col2"]]
> df.select(["col1", "col2"])
指定した列をすべて削除
< df.drop(["col1", "col2"], axis=1)
> df.drop(["col1", "col2"])
行・列の追加
列の追加
< df["new_col"] = df["A"] + 1
> df = df.with_columns((pl.col("A") + 1).alias("new_col"))
また、他のデータフレームから値をもってくる場合は以下の様にかきます:
> df = df.with_columns(df2["A"].alias("new_col"))
定数列の追加
< df["new_col"] = 0
> df = df.with_columns(pl.lit(0).alias("new_col"))
データフレームを下に結合
< pd.concat([df1, df2])
> pl.concat([df1, df2])
データフレームを横に結合
inner join:
< pd.merge(df1, df2, on="key", how="inner")
> df1.join(df2, on="key", how="inner")
left outer join:
< pd.merge(df1, df2, on="key", how="left")
> df1.join(df2, on="key", how="left")
注: right joinはPolars
にはありません。
フィルター
比較演算子
< df[(df["col1"] > 0) & (df["col2"] < 0)]
> df.filter((pl.col("col1") > 0) & (pl.col("col2") < 0))
注: 比較演算子やAND, ORの使い方は同じです。
指定した列が重複している行を削除
< df.drop_duplicates(subset=["col1"])
> df.unique(subset=["col1"])
指定した列がnullである行を削除
< df.dropna(subset=["col1"])
> df.drop_nulls(subset=["col1"])
変換 (Transform)
欠損値埋め
< df.fillna(0)
> df.fill_null(0)
1つの列に対して自作関数の適用
< df["new_col"] = df["col"].apply(custom_func)
> df = df.with_columns(pl.col("col").apply(custom_func).alias("new_col"))
集計
集計関数
平均:
< df.mean()
> df.select(pl.mean("col"))
groupごとに集計
< df.groupby("group_col").agg({"col1": "mean", "col2": "sum"})
> df.groupby("group_col").agg(pl.mean("col1"), pl.sum("col2"))
groupごとにカスタム集計関数の適用
< df.groupby("group_col").agg({"col1": custom_agg_func})
> df.groupby("group_col").agg(pl.col("col1").apply(custom_aggregate_function).alias("col1_agg"))
結び
この早見表では、基本的なデータ処理の利用ケースに焦点を当ててPandasとPolarsの対応関係をまとめました。Pandasはデータサイエンス分野で最も人気のあるライブラリですが、Polarsは比較的新しいが非常に強力なツールです。データ量が増加するにつれて、より効率的なツールへの移行や両方のライブラリの併用が求められるケースが増えています。本記事がそのようなケースでお役に立てれば幸いです。
なお、本記事の作成にはChatGPTを大いに活用しました(記載しているコードの動作確認は別途行っています)。ChatGPTの協力により、より詳細な情報を提供することができました。
Discussion