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

Python pandas:遍历df2从df1匹配数据填充列时出现KeyError

问题解决:Pandas基于列值匹配填充数据

错误原因分析

你遇到的KeyError: 'codekey'是因为df2中不存在codekey列,但代码错误地引用了df2["codekey"]。同时筛选条件逻辑有误:需要匹配的是df1的codekey等于"100",而非df2的。另外&运算符优先级高于==,每个比较条件必须用括号包裹,否则会出现逻辑错误。

修正后的循环写法

如果坚持使用循环方式,修正后的代码如下:

for i in range(len(df2)):
    # 正确构建筛选条件:df1的invoice匹配当前df2的invoice,且df1的codekey为100
    filter_mask = (df1["invoice"] == df2.loc[i, "invoice"]) & (df1["codekey"] == "100")
    # 提取对应的codevalue(用iloc[0]取第一个匹配值,确保每个invoice对应唯一的codekey=100记录)
    codekey_lookup = df1.loc[filter_mask, "codevalue"].iloc[0]
    df2.loc[i, "codekey1"] = codekey_lookup

更高效的Pandas原生方法

Pandas的核心优势是矢量化操作,循环遍历并非最优解,推荐以下两种高效实现方式:

方法1:使用merge关联匹配

# 从df1中筛选codekey=100的记录,保留invoice和codevalue并重命名列
codekey1_data = df1[df1["codekey"] == "100"][["invoice", "codevalue"]].rename(columns={"codevalue": "codekey1"})
# 左连接到df2,基于invoice列完成匹配填充
df2 = df2.drop("codekey1", axis=1).merge(codekey1_data, on="invoice", how="left")

方法2:使用字典映射

# 构建invoice到codekey=100对应codevalue的映射字典
codekey1_map = df1[df1["codekey"] == "100"].set_index("invoice")["codevalue"].to_dict()
# 直接通过映射填充df2的codekey1列
df2["codekey1"] = df2["invoice"].map(codekey1_map)

以上两种方法均能快速完成数据填充,避免了循环带来的性能损耗,更符合Pandas的使用规范。

内容的提问来源于stack exchange,提问作者Gursi-ng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 06:16:20