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

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)

代码说明

  1. 标记更新位置:用临时列_temp记录需要更新为当前Price的行(组首行或Lower Low行),其余行设为缺失值pd.NA
  2. 组内向前填充:通过groupby('Symbol').ffill(),让缺失值沿用组内最近的已更新值,完美复现Excel公式的迭代逻辑
  3. 清理临时列:移除辅助用的_temp列,得到最终结果

验证结果

运行后输出与期望一致:

SymbolDatePriceLower LowLower Value
A2023-05-12 16:00:000.898450.89845
A2023-05-15 15:00:000.900650.89845
A2023-05-15 22:00:000.900420.89845
A2023-05-16 07:00:000.898410.89845
A2023-05-16 14:00:000.894620.89845
A2023-05-17 07:00:000.89437Lower Low0.89437
A2023-05-17 20:00:000.894550.89437
A2023-05-18 02:00:000.892480.89437

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:00:26