
本文介绍如何使用 Polars 的 group_by().agg() 配合布尔转换与均值计算,高效求出每组中 value 列正值(≥0)行数占比,并返回结构清晰的结果 DataFrame。
本文介绍如何使用 polars 的 `group_by().agg()` 配合布尔转换与均值计算,高效求出每组中 `value` 列正值(≥0)行数占比,并返回结构清晰的结果 dataframe。
在数据聚合分析中,常需统计某列满足条件的记录比例(如正值、非空、达标等)。Polars 提供了高性能且表达力强的链式 API,无需手动计数再除法——只需将逻辑判断转为布尔序列,再对布尔值取均值即可:因为 True 被自动视为 1.0,False 视为 0.0,其均值即为 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()在聚合上下文中自动按组计算布尔值的平均值,等价于(True 计数) / (总行数); - 此方法简洁、向量化、无需
apply或 Python 循环,性能优异。
⚠️ 注意事项:
- 若需严格“大于 0”(排除 0),请改用
.gt(0); - 结果默认为
f64类型,如需保留两位小数可链式调用.round(2); - 该模式可泛化至任意布尔条件,例如
pl.col("status").is_in(["active"])统计活跃率。
此方案是 Polars 中实现“条件占比聚合”的推荐范式——语义清晰、代码简短、执行高效。

















