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

pandas实现antijoin反连接时出现KeyError: 'c'报错如何解决

错误原因

  • merge方法的on参数要求指定的列必须同时存在于左右两个DataFrame中,你的代码触发KeyError: 'c'有两个直接原因:
    • TableB是通过集合转列表生成的,默认只有1个整数类型的列名0,不存在名为c的列
    • 你写的'0'是字符串类型,和TableB实际的整数列名0不匹配,同时TableA也不存在0列
  • 额外逻辑说明:你用来生成TableB的{A, 'A', 'B', 'B'}是集合类型,会自动去重,最终TableB只有2行值为A、B。

修正方案

你需要匹配的是TableA的c列和TableB存储的字符串值,有两种常用写法:

写法1:统一列名后用on匹配

import pandas as pd
TableA = pd.DataFrame({'c': ['A', 'A', 'B', 'C', 'C'],
                    'k': [1, 2, 2, 2, 2],
                    'l': ['a', 'b', 'a', 'a', 'd']})
# 给TableB指定列名为c,和TableA的匹配列对齐
TableB = pd.DataFrame(list({'A', 'A', 'B', 'B'}), columns=['c'])  
# 单字段匹配,on只传c即可
merged_df = TableA.merge(TableB, on='c', how='left', indicator=True)

运行后_merge列值为both的就是两个表匹配到的行,值为left_only的就是TableA独有的行。

写法2:分别指定左右表匹配列

如果不想修改TableB的列名,可以用left_on+right_on分别指定左右表的匹配字段:

import pandas as pd
TableA = pd.DataFrame({'c': ['A', 'A', 'B', 'C', 'C'],
                    'k': [1, 2, 2, 2, 2],
                    'l': ['a', 'b', 'a', 'a', 'd']})
TableB = pd.DataFrame(list({'A', 'A', 'B', 'B'}))  
# 左表用c列匹配,右表用整数列0匹配
merged_df = TableA.merge(TableB, left_on='c', right_on=0, how='left', indicator=True)

简化删行方案

如果你不需要保留标记过程,直接删除匹配行可以用更简洁的isin方法实现:

# 直接保留TableA中c列值不在TableB里的行
TableA = TableA[~TableA['c'].isin(TableB[0].unique())]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:15:05