ピボット
DataFrame
の列をピボットし、以下のいずれかの集計を実行します:
- first
- sum
- min
- max
- mean
- median
ピボット操作は、1つまたは複数の列によるグループ化(これらが新しい y 軸になります)、ピボットされる列(これが新しい x 軸になります)、および集計から成ります。
データセット
shape: (5, 3)
┌─────┬─────┬─────┐
│ foo ┆ N ┆ bar │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ str │
╞═════╪═════╪═════╡
│ A ┆ 1 ┆ k │
│ A ┆ 2 ┆ l │
│ B ┆ 2 ┆ m │
│ B ┆ 4 ┆ n │
│ C ┆ 2 ┆ o │
└─────┴─────┴─────┘
Eager
shape: (3, 6)
┌─────┬──────┬──────┬──────┬──────┬──────┐
│ foo ┆ k ┆ l ┆ m ┆ n ┆ o │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞═════╪══════╪══════╪══════╪══════╪══════╡
│ A ┆ 1 ┆ 2 ┆ null ┆ null ┆ null │
│ B ┆ null ┆ null ┆ 2 ┆ 4 ┆ null │
│ C ┆ null ┆ null ┆ null ┆ null ┆ 2 │
└─────┴──────┴──────┴──────┴──────┴──────┘
Lazy
Polars の LazyFrame
は、常に計算のスキーマを静的に(クエリを収集する前に)知る必要があります。
ピボットの出力スキーマはデータに依存するため、クエリを実行せずにスキーマを決定することはできません。
Polars は Spark のようにこの事実を抽象化することができましたが、ユーザーが自分の足を撃つことのないようにしたいと思っています。コストは明確に示されるべきです。
q = (
df.lazy()
.collect()
.pivot(index="foo", columns="bar", values="N", aggregate_function="first")
.lazy()
)
out = q.collect()
print(out)
let q = df.lazy();
let q2 = pivot(
&q.collect()?,
["foo"],
["bar"],
Some(["N"]),
false,
None,
None,
)?
.lazy();
let out = q2.collect()?;
println!("{}", &out);
shape: (3, 6)
┌─────┬──────┬──────┬──────┬──────┬──────┐
│ foo ┆ k ┆ l ┆ m ┆ n ┆ o │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞═════╪══════╪══════╪══════╪══════╪══════╡
│ A ┆ 1 ┆ 2 ┆ null ┆ null ┆ null │
│ B ┆ null ┆ null ┆ 2 ┆ 4 ┆ null │
│ C ┆ null ┆ null ┆ null ┆ null ┆ 2 │
└─────┴──────┴──────┴──────┴──────┴──────┘