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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:45:03