数据透视
在 DataFrame
中透视一列并执行以下聚合之一:
- 第一个 (first)
- 最后一个 (last)
- 求和 (sum)
- 最小值 (min)
- 最大值 (max)
- 平均值 (mean)
- 中位数 (median)
- 计数 (len)
透视操作包括按一列或多列(这些将成为新的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
总是需要在静态地(在收集查询结果之前)知道计算的 schema(数据结构)。由于透视操作的输出 schema 取决于数据本身,因此在不运行查询的情况下无法确定其 schema。
Polars 本可以像 Spark 那样为你抽象这个事实,但我们不希望你因此“搬起石头砸自己的脚”。预先明确其代价是很重要的。
q = (
df.lazy()
.collect()
.pivot(index="foo", on="bar", values="N", aggregate_function="first")
.lazy()
)
out = q.collect()
print(out)
let q = df.lazy();
let q2 = pivot(
&q.collect()?,
["foo"],
Some(["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 │
└─────┴──────┴──────┴──────┴──────┴──────┘