如何计算Polars数据框中A=True与A=False的行数比值?
计算Polars数据框中布尔列的True/False行数比值
我有一个Polars数据框:
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], } )
如何计算A==True的行数与A==False的行数之间的比值?已知A的值始终为True或False。我自己找到一个解决方案,但感觉有点繁琐:
ntrue = df.filter(pl.col('A')==1).shape[0] ratio = ntrue/(df.shape[0]-ntrue)
更简洁的实现方式
可以利用Polars原生聚合函数直接计算,避免多次遍历数据框,效率和可读性都更好:
方法一:基于求和与计数的基础写法
布尔值在数值计算中会被自动转换为1(True)和0(False),因此直接对A列求和就能得到True的数量,再用总行数减去该值得到False的数量:
true_count = df.select(pl.col("A").sum()).item() total_count = df.height false_count = total_count - true_count ratio = true_count / false_count
方法二:用value_counts直接统计
通过value_counts一次性获取True和False的计数,再提取计算比值:
counts = df.select(pl.col("A").value_counts()).to_dict(as_series=False)["A"][0] true_count = next(item["count"] for item in counts if item["A"]) false_count = next(item["count"] for item in counts if not item["A"]) ratio = true_count / false_count
方法三:单行聚合计算
最简洁的写法,直接在聚合操作中完成比值计算:
ratio = df.select( (pl.col("A").sum() / (pl.col("A").count() - pl.col("A").sum())) ).item()
这些方法更贴合Polars的设计逻辑,处理大数据框时能避免多次过滤和读取形状的额外开销。
内容的提问来源于stack exchange,提问作者DeltaIV
相关产品推荐
相关产品推荐

