
本文介绍如何在 Polars DataFrame 中高效、简洁地计算布尔列中 True 行数与 False 行数的比值,推荐使用表达式 API 直接聚合,避免显式过滤和 shape 查询,兼顾性能与可读性。
本文介绍如何在 polars dataframe 中高效、简洁地计算布尔列中 `true` 行数与 `false` 行数的比值,推荐使用表达式 api 直接聚合,避免显式过滤和 shape 查询,兼顾性能与可读性。
在 Polars 中,布尔列(pl.Boolean)天然支持数值语义:True 等价于 1,False 等价于 0。因此,对布尔列调用 .sum() 即等价于统计 True 的数量;而 .not_().sum() 则先取逻辑非(True → False,False → True),再求和,即统计 False 的数量。二者相除即可直接得到目标比值。
以下为完整示例:
import polars as pl
import numpy as np
df = pl.DataFrame(
{
"nrs": [1, 2, 3, None, 5],
"names": ["foo", "ham", "spam", "egg", None],
"random": np.random.rand(5),
"A": [True, True, False, False, False],
}
)
# ✅ 推荐写法:一行表达式,纯惰性计算,零中间 DataFrame 构建
ratio = df.select(pl.col("A").sum() / pl.col("A").not_().sum()).item()
print(f"True 与 False 行数比值: {ratio:.3f}") # 输出示例:2.000该方法优势显著:
- 高性能:全程基于 Polars 表达式引擎,无需 materialize 子集或触发多次扫描;
- 简洁安全:自动处理空值(None 在布尔列中会被 .sum() 和 .not_().sum() 忽略,符合 Polars 的 null-aware 聚合规则);
- 类型清晰:.item() 显式提取标量结果,避免意外返回 Series。
⚠️ 注意事项:
- 若列 A 可能包含 null 值且你希望将其排除在分母外(即仅统计非空 False),当前写法已默认满足(.not_() 对 null 返回 null,.sum() 自动跳过);
- 若需支持任意布尔表达式(如 pl.col("status") == "active"),只需将 pl.col("A") 替换为对应表达式,其余逻辑不变;
- 避免使用 df.filter(...).shape[0] 类方式——它会触发完整行过滤与计数,开销更大,且易受空值/类型隐式转换影响。
总结:善用 Polars 布尔列的数值映射特性与链式表达式,是实现此类统计任务最地道、最高效的方式。










