🐈

Pandas → Polars 早見表

2023/05/19に公開

データサイエンスやデータエンジニアリングの分野において、効率的かつ柔軟なデータ処理を実現するためには、適切なツールの選択が不可欠です。最近では、高速かつ省メモリなデータ操作ライブラリであるPolarsが注目を浴びています。本記事では、この新たなライブラリと既存のデータ処理ツールであるPandasとの対応関係を簡潔にまとめます。特に、Polarsへの移行やトライアルをスムーズに進めるために、両ライブラリの使い方に焦点を当てて解説します。
逆引きクックブックのようなイメージです。

本ブログの見方

以下のフォーマットでまとめています。

<処理概要>

< <Pandasコード>
> <Polarsコード>

PandasPolarsのコードがまったく同じ場合は、一行のみ記載しています。


導入

インストール

< 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