我有一个包含 ID、DATE 和 OS 的 polars 数据框。对于每一天,我想计算出到那一天为止有多少个唯一 ID。
import polars as pl
df = (
pl.DataFrame(
{
"DAY": [1,1,1,2,2,2,3,3,3],
"OS" : ["A","B","A","B","A","B","A","B","A"],
"ID": ["X","Y","Z","W","X","J","K","L","X"]
}
)
)
期望输出:
shape: (3, 3)
┌─────┬─────┬─────┐
│ DAY ┆ A ┆ B │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 1 ┆ 2 ┆ 1 │
│ 2 ┆ 2 ┆ 3 │
│ 3 ┆ 3 ┆ 4 │
└─────┴─────┴─────┘
它看起来应该是这样的,因为在第 1 天,有 3 个值和 3 个 ID。在第 2 天,ID“X”使用相同的 OS 重复,因此,列 A 保持不变,而其他 2 个不同,因此将 2 添加到 B。在第 3 天,ID X 与 A 重复,而其他 2 个不同,因此它再次对每列求和。
我认为可以采用以下方法解决:
(
df
.pivot(
index="DAY",
on="OS",
aggregate_function=(pl.col("ID").cum_sum().unique())
)
)
您可以使用Expr.is_first_distinct
'ID'
标记每个 中 的每个第一个不同条目'OS'
。然后,您可以旋转这些结果并取其累计和。