基于另一pandas DataFrame修改列值触发KeyError该如何解决
错误原因
- 直接触发KeyError的问题是
df1[index, 'address']写法错误,pandas中如果要同时按行索引和列名取值,必须使用.loc属性,正确写法为df1.loc[index, 'address']。你直接用方括号传入元组时,pandas会将其识别为单个列名,你的表中不存在该列,因此抛出KeyError。 - 除此之外你的代码还有其他缺陷:仅处理了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
相关产品推荐
相关产品推荐

