如何将DataFrame元素与阈值数组逐列比较生成0-1结果表,解决KeyError报错
报错原因分析
KeyError: 0的核心原因是你使用了按标签取值的loc方法,但PORResult的行索引不是从0开始的连续整数(通常这类气温表的行索引会直接存年份数值),所以找不到标签为0的行。- 原有代码还存在逻辑错误:循环变量
i遍历的是121行的年份维度,但Percentile_90是长度365的日期维度数组,直接用Percentile_90[i]会出现索引越界,且维度对应关系完全错误;同时PORResult.loc[i]是长度365的Series,直接用if判断整个序列的布尔值也会触发报错。
最优解决方法(向量化运算,无需循环)
pandas支持广播运算,直接整表比较即可实现需求,运行效率远高于循环写法,一行代码就能完成:
# 生成布尔矩阵后转换为整型,符合条件的位置为1,不符合为0 CountResult = (PORResult > Percentile_90).astype(int)
说明:pandas会自动将长度为365的
Percentile_90数组匹配到DataFrame的365列,逐列对所有行的元素做比较,布尔值True转整型对应1,False对应0,输出的CountResult维度和PORResult完全一致,符合你的要求。
循环写法(仅做参考,不推荐使用,运行效率低)
如果需要用循环实现,可以按如下修改,用按位置取值的iloc替代loc,同时修正维度对应关系:
import pandas as pd # 初始化全0的CountResult,行列索引和PORResult完全对齐 CountResult = pd.DataFrame(0, index=PORResult.index, columns=PORResult.columns) # 遍历每一年(行维度) for year_pos in range(PORResult.shape[0]): # 遍历每一天(列维度) for day_pos in range(PORResult.shape[1]): if PORResult.iloc[year_pos, day_pos] > Percentile_90[day_pos]: CountResult.iloc[year_pos, day_pos] = 1
内容的提问来源于stack exchange,提问作者Megan Martin
相关产品推荐
相关产品推荐

