
本文介绍在 Polars 中处理众数(mode)计算时的歧义场景:当列中存在多个频率相同的最高频值时,mode() 默认返回所有候选值;而通过条件表达式可实现“仅当唯一众数存在时返回该值,否则返回 null”。
本文介绍在 polars 中处理众数(mode)计算时的歧义场景:当列中存在多个频率相同的最高频值时,`mode()` 默认返回所有候选值;而通过条件表达式可实现“仅当唯一众数存在时返回该值,否则返回 null”。
在数据分析中,众数(mode)指出现频率最高的值。但当多个值并列最高频时(如 [1, 1, 2, 2] 中 1 和 2 均出现两次),严格意义上不存在唯一的众数。Polars 的 pl.col("x").mode() 默认会返回所有并列值组成的列表(即 Series 含多个元素),这在需要标量语义(如聚合后与其它单值字段对齐)的场景下可能引发问题。
为确保结果的确定性与一致性,推荐使用 pl.when().then() 构建条件逻辑:仅当 mode() 返回恰好一个值时才保留它,否则返回 null。核心思路是判断 mode().len() == 1:
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 分支更清晰(也可省略,默认为 null)
)
print(result)
# shape: (2, 1)
# ┌──────┐
# │ b │
# │ --- │
# │ i64 │
# ╞══════╡
# │ null │
# │ null │
# └──────┘
⚠️ 注意事项:
- pl.col("b").mode().len() 计算的是 mode 表达式结果的长度(即并列众数个数),而非原始列长度;
- .otherwise(None) 可显式声明空值分支,增强可读性;若省略,pl.when().then() 默认补 null;
- 若需最终结果为单行单值(而非与原始行数对齐的列),应结合聚合操作,例如:
df.select(pl.when(pl.col("b").mode().len() == 1).then(pl.col("b").mode()).unique()) # → 返回 shape: (1, 1) 的 DataFrame,含单个 null 值
此方法兼顾了统计严谨性与工程实用性,适用于数据清洗、特征工程及报表生成等需明确缺失语义的生产环境。











