You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:23:21