
当数据列中存在多个出现频率相同的最大频次值时,Polars 的 mode() 默认返回全部候选值;本文介绍如何通过条件表达式(pl.when().then())确保仅当存在唯一众数时才返回该值,否则统一返回 null。
当数据列中存在多个出现频率相同的最大频次值时,polars 的 `mode()` 默认返回全部候选值;本文介绍如何通过条件表达式(`pl.when().then()`)确保仅当存在唯一众数时才返回该值,否则统一返回 `null`。
在使用 Polars 进行统计分析时,mode() 表达式用于计算列的众数(即出现频率最高的值)。但其默认行为是:只要多个值并列最高频次,就全部返回——这在某些业务场景下并不合理。例如,当列 b = [1, 1, 2, 2] 时,1 和 2 均出现 2 次,严格意义上不存在唯一众数,理想结果应为 null,而非 [1, 2]。
要实现“多众数 → 返回 null”,核心思路是:先计算 mode(),再判断其长度是否为 1。若长度为 1,说明众数唯一,返回该值;否则返回 null。这可通过 Polars 的条件表达式 pl.when(...).then(...).otherwise(None) 实现:
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)
.alias("b_mode")
)
print(result)
# shape: (1, 1)
# ┌────────┐
# │ b_mode │
# │ --- │
# │ i64 │
# ╞════════╡
# │ null │
# └────────┘
✅ 注意事项:
- pl.col("b").mode().len() 返回的是 mode 结果的元素个数(Expr.len()),类型为 Expr,因此可直接参与 pl.when() 条件判断;
- .otherwise(None) 显式指定无唯一众数时填充 null,语义更清晰(也可省略,默认即为 null);
- 若后续需将结果转为标量(如单值而非单行单列 DataFrame),可链式调用 .item()(需确保结果仅一行一列);
- 该方案适用于任意数值或类别型列,无需预处理,且完全惰性执行,性能高效。
进阶提示:若需对多列批量应用此逻辑,可结合 pl.col(dtype).name.map_elements(...) 或使用字典推导式构造表达式列表,保持代码简洁与可维护性。总之,借助 Polars 强大的布尔条件表达能力,轻松实现统计语义的精准控制。











