
本文介绍如何使用 Polars 的 group_by().agg() 配合布尔转换与均值聚合,高效计算每组中 value 列正值(≥0)所占百分比,代码简洁、性能优异,适用于大规模数据场景。
本文介绍如何使用 polars 的 `group_by().agg()` 配合布尔转换与均值聚合,高效计算每组中 `value` 列正值(≥0)所占百分比,代码简洁、性能优异,适用于大规模数据场景。
在数据分析中,常需统计某数值列在分组维度下满足特定条件(如大于零)的比例。Polars 提供了高度优化的表达式 API,无需显式循环或冗余中间列,即可一步完成该任务。
核心思路是:将数值条件(value ≥ 0)转化为布尔序列(True/False),再利用布尔值在数值上下文中的特性(True → 1, False → 0),通过 .mean() 直接计算 True 占比——这正是比例(即正值百分比)的数学本质。
以下为完整实现代码:
import polars as pl
df = pl.DataFrame(
{
"group": ["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"],
"value": [2, -1, 3, 1, -2, 1, 2, -1, 3, 2],
}
)
result = df.group_by("group").agg(
positive_percent = pl.col("value").ge(0).mean()
)
print(result)输出结果:
┌───────┬──────────────────┐ │ group ┆ positive_percent │ │ --- ┆ --- │ │ str ┆ f64 │ ╞═══════╪══════════════════╡ │ A ┆ 0.6 │ │ B ┆ 0.8 │ └───────┴──────────────────┘
✅ 关键说明:
-
pl.col("value").ge(0)生成布尔表达式,等价于value >= 0; - 对布尔列调用
.mean()会自动将其映射为0/1并求平均值,结果即为True出现频率(即正值占比); - 此方法天然支持
null值安全处理(默认忽略null),如需包含null作为分母的一部分,可改用.sum().over("group") / pl.count()组合; - 所有操作均为惰性表达式,底层由 Polars 查询引擎优化执行,内存效率高、速度远超 Pandas 等传统方案。
? 进阶提示:若需保留原始计数信息,可同时聚合总数与正值数量:
df.group_by("group").agg(
total = pl.count(),
positive_count = pl.col("value").ge(0).sum(),
positive_percent = pl.col("value").ge(0).mean()
)该模式可灵活扩展至任意布尔条件(如 > 100、!= 0、is_in([1,2,3]) 等),是 Polars 分组统计中推荐的标准实践。

















