Python实现DataFrame与列表逐行比较输出布尔值及代码校验
代码核查与实现方案
输入规则
- 1个10行、共500列的Pandas DataFrame,存储取值范围为0-10000(含两端边界)的随机整数
- 1个包含10个0-10000区间随机整数的列表,作为每行的判断阈值
需求目标
输出与输入DataFrame维度完全一致的布尔型DataFrame,逐行执行判断:第x行的元素大于列表中第x个阈值时返回True,否则返回False。
原代码问题核查
你写的核心比较逻辑是正确的,但存在4个细节问题:
df.head是无效代码:head是DataFrame的方法,不加括号不会执行任何操作;就算加括号写成df.head()也只会打印前5行数据,对后续逻辑无影响,可以直接删除。- 随机数范围不符合要求:
np.random.randint(0,10000)的取值区间是左闭右开,最大只能取到9999,覆盖不到需求要求的边界值10000。 - 阈值列表生成逻辑和需求不匹配:
random.sample(range(10000), 10)生成的是10个不重复的随机数,和需求里随机整数可重复的要求、以及Excel中RANDARRAY函数的生成逻辑不一致。 - 变量命名不规范:用
list作为变量名会覆盖Python内置的列表类型关键字,容易引发后续难以排查的bug,建议替换为有实际含义的名称比如threshold_list。
优雅实现方案
Pandas原生支持按维度广播比较,不需要手动转换数组维度,代码可读性更高:
import numpy as np import pandas as pd # 生成符合要求的原始DataFrame,上界设为10001保证能取到10000 df = pd.DataFrame(np.random.randint(0, 10001, size=(10, 500))) # 生成10个可重复、取值覆盖0-10000的阈值 threshold_list = np.random.randint(0, 10001, size=10).tolist() # 按行广播做大于比较,自动保留原DataFrame的索引和列名 res = df.gt(threshold_list, axis=0) print(res)
如果你更习惯用numpy的广播逻辑做运算,修正细节问题后的代码也可以正常运行:
import numpy as np import pandas as pd df = pd.DataFrame(np.random.randint(0,10001,size=(10, 500))) threshold_list = np.random.randint(0,10001,size=10).tolist() a = df.to_numpy() b = np.array(threshold_list) # b[:,None]将一维阈值数组转为10行1列的二维数组,触发numpy广播逐元素比较 res = pd.DataFrame(a > b[:, None], index=df.index, columns=df.columns) print(res)
两种方案的输出结果完全一致,都是10行500列的布尔型DataFrame,完全匹配需求。
内容的提问来源于stack exchange,提问作者Ravindra Veladi
相关产品推荐
相关产品推荐

