Pandas实现Excel公式报错KeyError: 'Lower_Value',求修复方案
问题:Excel公式迁移至Pandas时的KeyError修复
需求背景
将Excel数据迁移至Pandas,需实现Excel中Lower Value列的公式逻辑:
IF(B2<>B1,D2,IF(E2="Lower Low",D2,F1))
各列说明:
- Symbol:交易代码
- Date:带时间的日期
- Price:价格
- Lower Low:值为'Lower Low'或空单元格
- Lower Value:初始为当前组第一个Price,后续仅当出现'Lower Low'时更新为当前Price,否则沿用前一行值
原尝试代码报错KeyError: 'Lower_Value':
mod_df['Lower_Value'] = np.where(mod_df['Symbol'] != mod_df['Symbol'].shift(1),mod_df['Price'],np.where(mod_df['Lower Low'] == 'Lower Low', mod_df['Price'], mod_df['Lower_Value'].shift(1)))
错误原因
代码中试图引用尚未创建的Lower_Value列的移位值mod_df['Lower_Value'].shift(1),而Pandas的向量化操作无法在创建列的同时引用自身未计算的行值,因此触发KeyError。
解决方案
由于该逻辑依赖组内前一行的计算结果,可通过「标记更新位置 + 组内向前填充」的方式实现,无需循环:
具体代码
import pandas as pd # 测试数据 data= {'Symbol': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'], 'Date': ['2023-05-12 16:00:00', '2023-05-15 15:00:00', '2023-05-15 22:00:00', '2023-05-16 07:00:00', '2023-05-16 14:00:00', '2023-05-17 07:00:00', '2023-05-17 20:00:00', '2023-05-18 02:00:00'], 'Price': [0.89845,0.90065,0.90042,0.89841,0.89462,0.89437,0.89455,0.89248], 'Lower Low': ['', '', '', '', '', 'Lower Low', '', ''], } mod_df = pd.DataFrame(data) # 1. 标记需要保留Price的行:组内第一行 或 Lower Low为'Lower Low'的行 mod_df['_temp'] = mod_df.apply( lambda row: row['Price'] if (row.name == 0 or mod_df['Symbol'].iloc[row.name] != mod_df['Symbol'].iloc[row.name-1]) or row['Lower Low'] == 'Lower Low' else pd.NA, axis=1 ) # 2. 按Symbol分组后向前填充,得到Lower Value mod_df['Lower Value'] = mod_df.groupby('Symbol')['_temp'].ffill() # 3. 清理临时列 mod_df.drop('_temp', axis=1, inplace=True) print(mod_df)
代码说明
- 标记更新位置:用临时列
_temp记录需要更新为当前Price的行(组首行或Lower Low行),其余行设为缺失值pd.NA - 组内向前填充:通过
groupby('Symbol').ffill(),让缺失值沿用组内最近的已更新值,完美复现Excel公式的迭代逻辑 - 清理临时列:移除辅助用的
_temp列,得到最终结果
验证结果
运行后输出与期望一致:
| Symbol | Date | Price | Lower Low | Lower Value |
|---|---|---|---|---|
| A | 2023-05-12 16:00:00 | 0.89845 | 0.89845 | |
| A | 2023-05-15 15:00:00 | 0.90065 | 0.89845 | |
| A | 2023-05-15 22:00:00 | 0.90042 | 0.89845 | |
| A | 2023-05-16 07:00:00 | 0.89841 | 0.89845 | |
| A | 2023-05-16 14:00:00 | 0.89462 | 0.89845 | |
| A | 2023-05-17 07:00:00 | 0.89437 | Lower Low | 0.89437 |
| A | 2023-05-17 20:00:00 | 0.89455 | 0.89437 | |
| A | 2023-05-18 02:00:00 | 0.89248 | 0.89437 |
内容的提问来源于stack exchange,提问作者Gopinathan
相关产品推荐
相关产品推荐

