如何在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
相关产品推荐
相关产品推荐

