[Python][Polars]pythonのデータフレームLibrary PolarsのExpressionについて理解を深める

white polar bear on a pack of ice python
Photo by Pixabay on Pexels.com

Polars Expression

Polars documentation

これがPolarsのcore機能なので、十分に理解を深める価値がある。

例題データセット

Tutorialに従ってやってみる。

import polars as pl
import numpy as np

np.random.seed(12)

df = pl.DataFrame(
    {
        "nrs": [1, 2, 3, None, 5],
        "names": ["foo", "ham", "spam", "egg", None],
        "random": np.random.rand(5),
        "groups": ["A", "A", "B", "C", "B"],
    }
)
print(df)

Count unique values

aliasを使って新規の列を作る。下記のどちらのやり方でも同じ結果を生成する。

out = df.select(
    [
        pl.col("names").n_unique().alias("unique_names_1"),
        pl.col("names").unique().count().alias("unique_names_2"),
    ]
)
print(out)

various aggregations

様々な集計量の観測も簡単。

out = df.select(
    [
        pl.sum("random").alias("sum"),
        pl.min("random").alias("min"),
        pl.max("random").alias("max"),
        pl.col("random").max().alias("other_max"),
        pl.std("random").alias("std dev"),
        pl.var("random").alias("variance"),
    ]
)
print(out)

まあ、これは

df.describe()

で良いが。

Filter and conditionals

次の例では”names”の最後が”am”で終わるものの数をカウントしている。

out = df.select(
    [
        pl.col("names").filter(pl.col("names").str.contains(r"am$")).count(),
    ]
)
print(out)

binrary functions and modifications

結構複雑だが、次のようなこともできる。

out = df.select(
    [
        pl.when(pl.col("random") > 0.5).then(0).otherwise(pl.col("random")) * pl.sum("nrs"),
    ]
)
print(out)

“random”が\(0.5\)以上のときは\(0\)を返し、そうでないときは\(rondom * sum(nrs)\)という値を返している。

Window expression

次の例は面白い。”gruop”ごとの和、あるいは”names”ごとの和を\(1\)行で表現できる。

df = df.select(
    [
        pl.col("*"),  # select all
        pl.col("random").sum().over("groups").alias("sum[random]/groups"),
        pl.col("random").list().over("names").alias("random/name"),
    ]
)
print(df)

関連記事

pythonの新データフレームlibrary、Polarsについて

関連リンク

Polars documentation

コメント

タイトルとURLをコピーしました