pandas比较open列相邻值更新high列报KeyError如何高效解决
报错原因
你在给df['high']赋值的逻辑中直接引用了还未创建的high列,运行这行代码时high字段不存在,自然触发KeyError。
修复方案
你要实现的是滚动更新的高点序列:仅当前open同时高于前后两个open、且高于上一个high值时才更新high,可以按以下步骤用numpy+pandas实现,效率远高于iterrows遍历:
- 先计算当前open和前后open的大小关系
- 筛选出符合条件的候选高点
- 用累积最大值实现「仅新值更高才更新」的逻辑
可运行代码
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
相关产品推荐
相关产品推荐

