🦔

pandasでよくやる操作、Polarsでどうやるの?(Polars 1.12.0)

2024/10/27に公開

はじめに

「pandasでよくやるあの操作、Polarsだとどうやるんだろう?」と悩むこと、多いですよね。

そんな時にパッと確認できるよう、pandasでよくやる操作にを、Polarsでどう実現するか表としてまとめました。30個の操作を紹介しています。バージョンは以下です、

  • pandas: 2.2.3 (2024/09/20 リリース)
  • Polars: 1.12.0(2024/10/27 リリース)

また、コードは全てGoogle Colaboraotryに公開しています。

https://colab.research.google.com/drive/1HZZKSJzTcT1zX1YjySTtkfr3CySxgevL?usp=sharing

一覧表

やること pandas Polars
列の選択 df[["a"]] df.select(pl.col("a"))
行のフィルタリング df[df["a"] > 3] df.filter(pl.col("a") > 3)
新規列追加(既存列の利用) df["c"] = df["a"] + df["b"] df = df.with_columns(
  (
  pl.col("a") + pl.col("b")
  )
  .alias("c")
)
新規列追加(別データの利用) df["a"] = data df = df.with_columns(
  pl.Series(data).alias("a")
)
dictの適用 df["b"] = df["a"].map(your_dict) df = df.with_columns(
  pl.col("a")
  .replace_strict(your_dict)
  .alias("b")
)
正規表現による置換 df["a"] = df["a"].str.replace(
  "[0-9]", "", regex=True
)
df = df.with_columns(
  pl.col("a").str.replace("[0-9]", "")
)
UDFの適用
(intを+10するUDF plus_10 の例)
df["b"] = df["a"].apply(plus_10) df = df.with_columns(
  pl.col("a")
  .map_elements(
    plus_10,
    return_dtype=pl.Int32
  )
  .alias("b")
)
行方向のスライス df[1:3] df.slice(1, 2)
nullを数える df["a"].isnull().sum() df["a"].is_null().sum()
value_countsのnormalizeをする df["a"].value_counts(
  normalize=True
)
df["a"].value_counts(
  normalize=True
)
重複行を落とす df.drop_duplicates() df.unique()
シャッフル df.sample(frac=1.0) df.sample(fraction=1.0, shuffle=True)
型の変更 df["a"] = df["a"].astype(str) df = df.with_columns(
  pl.col("a").cast(pl.String)
)
ソート df.sort_values("a") df.sort("a")
列名の変更 df.rename(
  columns={"a": "A"}
)
df.rename({"a": "A"})
文字列の付け足し df["a"] = "add_" + df["a"] df = df.with_columns(
  (
  pl.lit("add_") + pl.col("a")
  )
  .alias("a")
)
任意の位置に列を追加する df.insert(0, "a", [1, 2, 3]) df = df.insert_column(
  0,
  pl.Series("d", [4, 5, 6])
)
要素の文字数を数える df["a"].str.len() df["a"].str.len_chars()
要素の単語数(半角スペース区切り)を数える df["b"].str.split().str.len() df["a"].str.split(" ").list.len()
要素のstr ↔︎ listの変換

例:
- str: "1 2" → list: ["1", "2"]
- list: ["1", "2"] → str: "1 2"
str → list
df["a"] = df["a"].str.split(" ")

list → str
df["a"] = df["a"].str.join(" ")
str → list
df = df.with_columns(
  pl.col("a").str.split(" ")
)

list → str
df = df.with_columns(
  pl.col("a").list.join(" ")
)
wide型 ↔︎ long型の変換 wide → long
df_long = pd.melt(df,
  id_vars="key_col",
  var_name="var_name",
  value_name="value_name"
)

long → wide
df_wide = df_long.pivot(
  index="key_col",
  columns="var_name",
  values="value_name"
)
wide → long
df_long = df.unpivot(
  index="key_col",
  variable_name="var_name",
  value_name="value_name"
)

long → wide
df_wide = df_long.pivot(
  index="key_col",
  on="var_name",
  values="value_name"
)
list、tupleで持つ要素を、行方向に展開 df.explode("a") df.explode("a")
特定の列をキーにした左結合 pd.merge(
  df,
  df_join,
  on="a",
  how="left"
)
df.join(
  df_join,
  on="a",
  how="left"
)
縦方向への連結 pd.concat(
  [df_pd, df_concat_pd]
)
pl.concat(
  [df_pl, df_concat_pl]
)
グループ化した結果で新規列を作成する df["c"] = df.groupby("b")["a"].transform(len) df = df.with_columns(
  pl.col("a").count().over("b")
  .alias("c")
)
グループ化して統計量を計算する df.groupby("b").agg(
  {"a": "mean", "c": "sum"}
)
df.group_by("b").agg(
  [pl.mean("a"), pl.sum("c")]
)
csvファイルの読み込み、書き出し df.to_csv("a.csv", index=False) df.write_csv("a.csv")
可視化 散布図
df.plot.scatter(
  x="a",
  y="b"
)

線グラフ
df.plot.line(
  x="a",
  y="b"
)

棒グラフ
df.plot.bar(
  x="c",
  y="a"
)
散布図
df.plot.point(
  x="a",
  y="b"
)

線グラフ
df.plot.line(
  x="a",
  y="b"
)

棒グラフ
df.plot.bar(
  x="c",
  y="a"
)
インデックス列を作成する - df = df.with_row_index()
pandasからpolarsにする - df = pl.from_pandas(df)

登壇資料

https://docs.google.com/presentation/d/1wTOMTL7TreqE4uTyp0msCxhCDqmMRD4MmB10idZs5xA/edit?usp=sharing

Discussion