本文介绍在 polars 中处理众数(mode)不唯一场景的解决方案:当一列存在多个频率最高的值时,避免返回多个结果,而是统一返回 null,从而明确表达“无唯一众数”的语义。
本文介绍在 polars 中处理众数(mode)不唯一场景的解决方案:当一列存在多个频率最高的值时,避免返回多个结果,而是统一返回 null,从而明确表达“无唯一众数”的语义。
在数据分析中,mode() 是一个常用聚合函数,用于获取出现频率最高的值。但 Polars 的默认行为是:当存在多个值具有相同最高频次时,mode() 会返回全部候选值(例如 [1, 2]),而非报错或返回空值。这在需要严格单值语义的场景(如指标计算、ETL 校验、下游系统对接)中可能引发歧义或异常。
要实现“仅当众数唯一时返回该值,否则返回 null”,推荐使用 pl.when().then() 表达式进行条件控制:
import polars as pl
df = pl.DataFrame({"a": [1, 1, 2, 3], "b": [1, 1, 2, 2]})
result = df.select(
pl.when(pl.col("b").mode().len() == 1)
.then(pl.col("b").mode())
.otherwise(None) # 显式指定 else 分支为 None,增强可读性
)
print(result)
# shape: (2, 1)
# ┌──────┐
# │ b │
# │ --- │
# │ i64 │
# ╞══════╡
# │ null │
# │ null │
# └──────┘
✅ 关键逻辑说明:
- pl.col("b").mode() 计算众数(返回 Series);
- .len() 获取众数结果的长度(若为 1,说明唯一;若 >1,说明并列);
- pl.when(...).then(...).otherwise(None) 构成完整三元逻辑,确保非唯一时返回 null(Polars 中 None 自动转为 null 值)。
⚠️ 注意事项:
- 若你只需单个 null 行(而非与原 DataFrame 行数对齐的多行 null),应改用聚合模式(.agg())而非 .select():
df.select( pl.when(pl.col("b").mode().len() == 1) .then(pl.col("b").mode().first()) # 取首个(此时仅1个) .otherwise(None) .alias("mode_b") ) # 返回 shape: (1, 1) 的单行结果 - mode() 对空值(null)默认忽略;若需包含 null 作为候选众数,请先用 .fill_null() 预处理。
- 此方案兼容 Polars 0.20.0+,无需额外依赖,纯表达式驱动,性能高效。
总结:通过 when/then/otherwise 组合 mode().len() 判断,即可优雅实现“唯一众数优先,否则退化为 null”的健壮逻辑——既符合统计学严谨性,也满足工程化数据管道对确定性输出的要求。











