如何在Polars中按行统计正、负值的数量?
Polars按行统计正负值数量:原理解析与完整方案
一、原正值统计代码的原理拆解
你用到的pl.fold代码核心逻辑是逐列累加布尔值的数值化结果,具体步骤如下:
- 生成布尔掩码:
pl.col("*") > 0会选中DataFrame的所有列,对每个元素判断是否大于0,返回一个由True/False组成的临时DataFrame。在Polars的数值运算中,True会被自动转为1,False转为0。 - fold累加计算:
pl.fold是一个聚合工具,这里的作用是按行对所有列的布尔值结果进行累加:acc=pl.lit(0):设置累加的初始值为0;function=lambda acc, x: acc + x:定义累加逻辑,把当前列的每个元素(已转成1/0)加到累加器acc上;exprs=pl.col("*") > 0:指定要参与累加的所有列的布尔结果。
最终每一行的累加结果,就是该行中正值的数量。
二、完整的正负值统计解决方案
方法1:用sum替代fold(更简洁直观)
Polars支持直接对布尔列按行求和,布尔值的求和等价于统计True的数量,代码更简洁:
# 生成新的统计DataFrame result = data_frame.select( (pl.col("*") > 0).sum(axis=1).alias("pos"), (pl.col("*") < 0).sum(axis=1).alias("neg") ) # 或者在原DataFrame中新增列 data_frame = data_frame.with_columns( pos=(pl.col("*") > 0).sum(axis=1), neg=(pl.col("*") < 0).sum(axis=1) )
运行后result的输出完全符合需求:
shape: (5, 2) ┌─────┬─────┐ │ pos ┆ neg │ │ --- ┆ --- │ │ u32 ┆ u32 │ ╞═════╪═════╡ │ 3 ┆ 1 │ │ 1 ┆ 3 │ │ 2 ┆ 2 │ │ 2 ┆ 2 │ │ 3 ┆ 1 │ └─────┴──────┘
方法2:用fold分别统计正负值
如果你想延续fold的写法,也可以分别对正值和负值的布尔结果进行累加:
result = data_frame.select( pl.fold(acc=pl.lit(0), function=lambda acc, x: acc + x, exprs=pl.col("*") > 0).alias("pos"), pl.fold(acc=pl.lit(0), function=lambda acc, x: acc + x, exprs=pl.col("*") < 0).alias("neg") )
内容的提问来源于stack exchange,提问作者Sigi
相关产品推荐
相关产品推荐

