LoginSignup
7
10

More than 1 year has passed since last update.

pandasからpolarsへの移行: 基本的な処理の比較

Posted at

はじめに

いくつかの基本的な処理をpandasとpolarsの両方で記述しました。
pandasからpolarsに移行する際の参考になればと思います。

polarsそのものに対する説明やメソッド等の説明は特にしないので、必要であれば他の人の記事や公式ドキュメントを参照することをおすすめします。

ライブラリのバージョンは以下の通り

  • pandas==1.5.3
  • polars==0.16.16

ライブラリは以下のような形で読み込んでいます。

import pandas as pd
import polars as pl

読み込み・書き込み

csvの読み込み

pandas

df = pd.read_csv("data.csv")

polars

df = pl.read_csv("data.csv")

ほぼ同じ記法で書けます。
キーワード引数を使用する場合は、引数の名称が微妙に異なっているので注意が必要です。
詳細は公式ドキュメントを参照してください。

csvの書き込み

pandas

df.to_csv("data_2.csv", index=False)

polars

df.write_csv("data_2.csv")

メソッド名が違うだけで基本同じです。
こちらもcsvの読み込みと同じでキーワード引数の名称が微妙に異なっているので注意が必要です。

またpolarsにはindex列が存在しないため、.write_csv()時にindexは書き込まれません。
indexが欲しい場合は、.with_row_count()でindex列を追加しましょう。

polars

df.with_row_count("idx").write_csv("data_2.csv")

行の操作

行の追加

pandas

df_2 = pd.DataFrame(
    {
        "A": [0.2, 0.1, 0.3, 0.1, 0.5],
        "B": [0.8, 0.9, 0.6, 0.4, 0.2],
        "C": [0.4, 0.2, 0.7, 0.1, 0.8],
    }
)
df = pd.concat([df, df_2], ignore_index=True)

polars

df_2 = pl.DataFrame(
    {
        "A": [0.2, 0.1, 0.3, 0.1, 0.5],
        "B": [0.8, 0.9, 0.6, 0.4, 0.2],
        "C": [0.4, 0.2, 0.7, 0.1, 0.8],
    }
)
df = pl.concat([df, df_2])

polarsではignore_indexでindexを振りなおす必要はありません。

行の選択

pandas

df.loc[[0, 2, 4], :]

polars

df[[0, 2, 4]]

polarsには.loc.ilocが存在しません。選択する行はそのまま[]に入れます。

列の操作

列の追加

既存の列から新たな列を計算する場合

pandas

df["A*C"] = df["A"] * df["C"]

polars

df = df.with_columns((pl.col("A") * pl.col("C")).alias("A*C"))

polarsの方は若干ややこしく見えますが、pl.col()に列名を入れて式を記述し、.alias()に新たな列名を記述すればよいです。
また、式全体を()で囲まないと正しい処理がされないので注意してください。
今回の場合はpl.col("A") * pl.col("C")()で囲む必要があります。

ちなみにpolarsにおいて、.alias()を既存の列と同じ名称にすると、列の値を更新できます。

polars

df = df.with_columns((pl.col("A") * pl.col("C")).alias("A"))

DataFrame外のデータを追加する場合

pandas

d = [0.2, 0.3, 0.2, 0.1, 0.6]
df["D"] = d

polars

d = [0.2, 0.3, 0.2, 0.1, 0.6]
df = df.with_columns(pl.Series(d).alias("D"))

データ形式がSeriesになっていない場合は、pl.Seriesに入れる必要があるようです。

列の削除

pandas

df = df.drop(["A", "B"], axis=1)

polars

df = df.drop(["A", "B"])
# もしくは
df = df.drop("A", "B")

polarsの場合はaxis=1の指定が必要ありません。というよりaxis引数自体が無いようです。

列の選択

pandas

df[["A", "B"]]

polars

df.select(["A", "B"])

.select()を使う必要があるだけで、記法は大体同じです。

その他

DataFrameのコピー

pandas

df_copy = df.copy()

polars

df_copy = df.clone()

どちらもディープコピーをします。

numpyへの変換

pandas

df_numpy = df.values
# もしくは
df_numpy = df.to_numpy()

polars

df_numpy = df.to_numpy()

polarsでは.valuesは使えません。

おわりに

本格的にpolarsに移行するには本記事の内容は薄いですが、足がかりにはなると思います。
また、気が向いたら内容をより充実させてみたいと思います。

7
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10