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

如何在Polars中按行统计正、负值的数量?

Polars按行统计正负值数量:原理解析与完整方案

一、原正值统计代码的原理拆解

你用到的pl.fold代码核心逻辑是逐列累加布尔值的数值化结果,具体步骤如下:

  1. 生成布尔掩码:pl.col("*") > 0 会选中DataFrame的所有列,对每个元素判断是否大于0,返回一个由True/False组成的临时DataFrame。在Polars的数值运算中,True会被自动转为1,False转为0。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:24:42