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

pandas比较open列相邻值更新high列报KeyError如何高效解决

报错原因

你在给df['high']赋值的逻辑中直接引用了还未创建的high列,运行这行代码时high字段不存在,自然触发KeyError。

修复方案

你要实现的是滚动更新的高点序列:仅当前open同时高于前后两个open、且高于上一个high值时才更新high,可以按以下步骤用numpy+pandas实现,效率远高于iterrows遍历:

  1. 先计算当前open和前后open的大小关系
  2. 筛选出符合条件的候选高点
  3. 用累积最大值实现「仅新值更高才更新」的逻辑

可运行代码

import pandas as pd
import numpy as np

# 测试数据构造
data = {
    'date': ['2021-10-19 01:35:00', '2021-10-19 01:34:00', '2021-10-19 01:33:00', 
             '2021-10-19 01:32:00', '2021-10-19 01:31:00', '2021-10-19 01:30:00'],
    'open': [2.135, 2.130, 2.129, 2.127, 2.130, 2.138]
}
df = pd.DataFrame(data)

# 1. 计算当前open是否同时高于前后两个open
gt_prev = df['open'] > df['open'].shift(1)
gt_next = df['open'] > df['open'].shift(-1)
# 首尾行没有前/后值,可根据实际需求调整规则
gt_prev.iloc[0] = True
gt_next.iloc[-1] = True

# 2. 生成候选高点:满足条件的位置取open,否则取NaN
candidate_high = np.where(gt_prev & gt_next, df['open'], np.nan)

# 3. 先填充空值,再用累积最大值实现只能升不能降的high列
df['high'] = pd.Series(candidate_high).fillna(method='ffill').cummax()

# 同步计算low列的逻辑(对称修改符号即可)
lt_prev = df['open'] < df['open'].shift(1)
lt_next = df['open'] < df['open'].shift(-1)
lt_prev.iloc[0] = True
lt_next.iloc[-1] = True
candidate_low = np.where(lt_prev & lt_next, df['open'], np.nan)
df['low'] = pd.Series(candidate_low).fillna(method='ffill').cummin()

补充说明

如果实际需求和上述逻辑有差异,只需要调整候选高点的筛选条件即可,只要保证在引用high列之前先完成初始化/填充逻辑,就不会再出现KeyError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:36:04