pandas实现antijoin反连接时出现KeyError: 'c'报错如何解决
错误原因
- merge方法的
on参数要求指定的列必须同时存在于左右两个DataFrame中,你的代码触发KeyError: 'c'有两个直接原因:- TableB是通过集合转列表生成的,默认只有1个整数类型的列名
0,不存在名为c的列 - 你写的
'0'是字符串类型,和TableB实际的整数列名0不匹配,同时TableA也不存在0列
- TableB是通过集合转列表生成的,默认只有1个整数类型的列名
- 额外逻辑说明:你用来生成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
相关产品推荐
相关产品推荐

