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

基于另一pandas DataFrame修改列值触发KeyError该如何解决

错误原因
  1. 直接触发KeyError的问题是df1[index, 'address']写法错误,pandas中如果要同时按行索引和列名取值,必须使用.loc属性,正确写法为df1.loc[index, 'address']。你直接用方括号传入元组时,pandas会将其识别为单个列名,你的表中不存在该列,因此抛出KeyError。
  2. 除此之外你的代码还有其他缺陷:仅处理了mon一列,无法覆盖tue、wed等其他日期列;行遍历iterrows的效率极低,不适合处理中大型数据集;如果df2中同一个address存在多条匹配记录,你将返回的Series直接转float的操作会报错。
正确实现方案

推荐使用向量化操作完成需求,避免逐行遍历,性能和可读性都更好:

import pandas as pd

# 第一步:处理df2为索引对齐的结构,方便匹配
# 先对df2按address去重(确保每个address唯一,符合你的示例场景),再设置address为索引
df2_indexed = df2.drop_duplicates(subset='address', keep='first').set_index('address')

# 第二步:获取所有需要更新的日期列(排除address列)
date_cols = df1.columns.difference(['address'])

# 第三步:逐列批量替换符合条件的值
for col in date_cols:
    # 构造条件掩码:df1当前单元格值>0,且对应address在df2同列的值>0
    mask = (df1[col] > 0) & (df1['address'].map(df2_indexed[col]) > 0)
    # 对满足条件的位置,替换为df2的对应值
    df1.loc[mask, col] = df1.loc[mask, 'address'].map(df2_indexed[col])

执行完上述代码后得到的df1即为你预期的结果。

内容的提问来源于stack exchange,提问作者Raúl Casado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:27:02