如何在Polars DataFrame分组中统计多列唯一组合数并返回单列
解决方法
要统计每组内gender和birth_dt组合的唯一记录数,你需要把这两列作为一个整体来处理,而不是单独统计每列的唯一值。这里有两种可行的实现方式:
方式一:用结构体组合列后计算唯一值
result = df.group_by("ID").agg( pl.struct("gender", "birth_dt").n_unique().alias("unique_gender_birth_count") ) print(result)
运行后输出:
shape: (2, 2) ┌─────┬──────────────────────────┐ │ ID ┆ unique_gender_birth_count │ │ --- ┆ --- │ │ str ┆ u32 │ ╞═════╪══════════════════════════╡ │ B ┆ 2 │ │ A ┆ 2 │ └─────┴──────────────────────────┘
方式二:先去重组合列再分组计数
# 先保留ID+gender+birth_dt的唯一组合,再按ID统计数量 result = df.unique(subset=["ID", "gender", "birth_dt"]).group_by("ID").agg( pl.count().alias("unique_gender_birth_count") ) print(result)
这个方法的输出和方式一完全一致。
为什么之前的代码不对?
- 你尝试的第一种代码:
col("gender", "birth_dt").unique().count().over("ID")是分别对gender和birth_dt列单独计算唯一值数量,再把结果按ID广播到每一行,所以得到的是每列各自的唯一值数,不是两列组合的唯一组数。 - 第二种代码:
col("gender", "birth_dt").n_unique()本质上是对每列单独调用n_unique()方法,统计的是每列自身的唯一值数量,而非两列组合后的唯一记录数。
内容的提问来源于stack exchange,提问作者NedDasty
相关产品推荐
相关产品推荐

