Polars分组内唯一众数查找:无需Join的实现方案
无需Join实现Polars分组内唯一众数查找
问题描述
我已实现基于Polars的分组内唯一众数查找功能,当前方案通过Join操作将众数结果关联回原DataFrame。请问是否存在无需使用Join的实现方式?
无需Join的实现方案
使用Polars的**窗口函数(over())**可以直接在原数据集上计算分组内的统计值,无需额外的Join操作。核心思路是通过pl.col("value").mode()配合over("group")获取每个分组的众数,再判断众数是否唯一,最后生成结果列。
完整代码
import polars as pl # 示例数据 data = pl.DataFrame({ "group": ["A", "A", "B", "B", "C", "C", "C", "C"], "value": [1, 1, 2, 2, 3, 3, 4, 4] }) # 窗口函数实现:直接在原DataFrame添加分组众数列 result = data.with_columns( pl.when(pl.col("value").mode().over("group").len() == 1) .then(pl.col("value").mode().over("group").first()) .otherwise(-999) .alias("group_mode") ) print(result)
运行结果
shape: (8, 3) ┌───────┬───────┬────────────┐ │ group ┆ value ┆ group_mode │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═══════╪═══════╪════════════╡ │ A ┆ 1 ┆ 1 │ │ A ┆ 1 ┆ 1 │ │ B ┆ 2 ┆ 2 │ │ B ┆ 2 ┆ 2 │ │ C ┆ 3 ┆ -999 │ │ C ┆ 3 ┆ -999 │ │ C ┆ 4 ┆ -999 │ │ C ┆ 4 ┆ -999 │ └───────┴───────┴────────────┘
方案说明
这种方式通过over("group")将聚合逻辑转为窗口计算,直接在原DataFrame上新增结果列,避免了Join操作:
- 代码更简洁,无需拆分再合并数据集
- 性能更优,减少了数据 shuffle 步骤
内容的提问来源于stack exchange,提问作者pbh
相关产品推荐
相关产品推荐

