Polars 中正确计算分组模式(Mode)的完整指南

张开发
2026/4/9 20:36:30 15 分钟阅读

分享文章

Polars 中正确计算分组模式(Mode)的完整指南
本文详解如何在 Polars 中对分组数据高效计算众数mode解决 AttributeError: module polars has no attribute mode 常见错误涵盖数值型与字符串型列的统一处理并提供可直接复用的表达式写法与最佳实践。 本文详解如何在 polars 中对分组数据高效计算众数mode解决 attributeerror: module polars has no attribute mode 常见错误涵盖数值型与字符串型列的统一处理并提供可直接复用的表达式写法与最佳实践。在 Polars 中进行分组聚合时用户常误以为 pl.mode() 是类似 pl.mean() 或 pl.max() 的顶层聚合函数从而直接调用报错AttributeError: module polars has no attribute mode。根本原因在于mode() 并非语法糖函数而是 Expr 类的原生方法必须通过 pl.col(...).mode() 显式调用且它返回的是一个 list因可能存在多个并列众数不能直接用于 agg() 中——需配合 .first()、.last() 或 .list() 等上下文操作才能安全嵌入聚合逻辑。以下是一个简洁、健壮且可扩展的实现方案? 正确用法基于 Expr.mode() 的聚合表达式import polars as plimport polars.selectors as cs# 示例数据含日期差字段以 D 结尾和分组键df pl.DataFrame({ aD: [200, 200, 300, 400, 1, 3], bD: [2, 3, 6, 4, 5, 1], case_id: [1, 1, 1, 2, 2, 2], category: [A, A, B, B, C, C] # 字符串列示例})# 定义聚合表达式支持数值 字符串def date_expr(): # 自动匹配所有以 D 结尾的列数值或字符串均可 date_cols cs.ends_with(D) return [ date_cols.max().name.prefix(max_), date_cols.min().name.prefix(min_), date_cols.mean().name.prefix(mean_), date_cols.std().name.prefix(std_), # ? 关键mode 必须链式调用 .first() 取首个众数避免 list 类型冲突 date_cols.mode().first().name.prefix(mode_), # ? 字符串列同样适用无需类型判断 cs.by_name(category).mode().first().alias(mode_category) ]result df.group_by(case_id).agg(date_expr())print(result)输出示例 Tellers AI Tellers是一款自动视频编辑工具可以将文本、文章或故事转换为视频。

更多文章