🦔
pandasでよくやる操作、Polarsでどうやるの?(Polars 1.12.0)
はじめに
「pandasでよくやるあの操作、Polarsだとどうやるんだろう?」と悩むこと、多いですよね。
そんな時にパッと確認できるよう、pandasでよくやる操作にを、Polarsでどう実現するか表としてまとめました。30個の操作を紹介しています。バージョンは以下です、
- pandas: 2.2.3 (2024/09/20 リリース)
- Polars: 1.12.0(2024/10/27 リリース)
また、コードは全てGoogle Colaboraotryに公開しています。
一覧表
やること | 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 → listdf["a"] = df["a"].str.split(" ") list → str df["a"] = df["a"].str.join(" ")
|
str → listdf = df.with_columns( pl.col("a").str.split(" ") ) list → str df = df.with_columns( pl.col("a").list.join(" ") )
|
wide型 ↔︎ long型の変換 | wide → longdf_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 → longdf_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) |
登壇資料
Discussion