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

如何在Pandas每行统计指定范围元素数量?现有实现结果异常

问题:统计DataFrame每行落在指定数值范围的元素数量

你写的方案完全无法满足需求,核心问题是自定义函数里的条件判断逻辑彻底错误,导致统计结果和预期完全不符。

原代码的错误点

  • 条件判断逻辑混乱:比如row.loc['A'] and row.loc['B'] and row.loc["C"] in range(1,3),实际是判断A≠0、B≠0且C在[1,3),而不是A、B、C三个元素都落在该范围内。
  • elif分支逻辑错误:比如row.loc['A'] and row.loc['B'] in range(1,3)是判断A≠0且B在范围,不是A和B都在范围,这完全偏离了“统计落在范围内的元素数量”的需求。

正确的实现方案

推荐两种方式,第二种是pandas更高效的向量化操作:

方式一:修复自定义函数逻辑

通过通用函数统计每行落在指定范围的元素个数,避免重复写多个函数:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,10,size=(10, 3)), columns=list('ABC'))

def count_in_range(row, lower, upper):
    # 遍历行内元素,统计符合范围的数量
    return sum(1 for val in row if lower <= val < upper)

# 生成三个统计列
df['Val_1'] = df.apply(lambda row: count_in_range(row, 1, 3), axis=1)
df['Val_2'] = df.apply(lambda row: count_in_range(row, 3, 6), axis=1)
df['Val_3'] = df.apply(lambda row: count_in_range(row, 6, 10), axis=1)

print(df)

方式二:向量化操作(推荐,效率更高)

直接对整个DataFrame进行范围判断,再按行求和,避免循环,适合大数据集:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,10,size=(10, 3)), columns=list('ABC'))

# 布尔矩阵按行求和,得到每行符合条件的元素数
df['Val_1'] = ((df >= 1) & (df < 3)).sum(axis=1)
df['Val_2'] = ((df >= 3) & (df < 6)).sum(axis=1)
df['Val_3'] = ((df >= 6) & (df < 10)).sum(axis=1)

print(df)

验证示例

拿你输出中的第4行数据A=4, B=6, C=2来说:

  • 正确统计结果:Val_1=1(只有C=2在1-3),Val_2=1(只有A=4在3-6),Val_3=1(只有B=6在6-10)
  • 原代码输出的Val_1=3、Val_2=1、Val_3=2完全错误,这就是逻辑错误导致的结果偏差。

内容的提问来源于stack exchange,提问作者Felipe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:03:27