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
コメント