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
相关产品推荐
相关产品推荐

