Pandas识别两表Order ID+Product ID差集及TypeError报错解决
参考数据集
- Data1 样例:

- Data2 样例:

两个数据集均以 Order ID + Product ID 组合作为主键,单个数据集内不存在该主键组合重复的记录。
问题说明
- 问题1:识别存在于Data1、但缺失于Data2的主键组合对应记录
- 问题2:识别缺失于Data1、但存在于Data2的主键组合对应记录
原有代码报错原因
原代码抛出TypeError: unsupported operand type(s) for -: 'str' and 'int'的核心原因:
- 逻辑选型错误:
subtract是针对数值字段做减法运算的方法,而两个DataFrame中存在大量字符串类型的业务字段,根本不支持和fill_value指定的数值0做减法运算,完全不匹配「匹配主键找差集」的需求。 - 主键拼接存在类型隐患:直接用
+连接两个字段时,如果Order ID和Product ID字段类型不统一(比如一个是字符串、一个是整数),本身就会触发类型运算错误。
正确实现方案
不需要强行做数值运算,pandas提供了专门的表关联方法可以快速识别差集,以下给出两种常用实现:
方法1:merge关联法(推荐,无需手动拼接主键,无类型冲突风险)
利用merge的indicator参数可以直接标记每条记录的来源表,筛选效率高,也不会出现主键拼接错误的问题。
求解问题1(Data1独有记录)
# 仅取df2的主键列做匹配,降低内存开销 match_df = df1.merge( df2[["Order ID", "Product ID"]], on=["Order ID", "Product ID"], how="left", indicator=True ) # 筛选仅在左表(df1)存在的记录,去掉标记列后即为结果 res1 = match_df[match_df["_merge"] == "left_only"].drop(columns="_merge")
求解问题2(Data2独有记录)
match_df = df2.merge( df1[["Order ID", "Product ID"]], on=["Order ID", "Product ID"], how="left", indicator=True ) res2 = match_df[match_df["_merge"] == "left_only"].drop(columns="_merge")
方法2:主键拼接+isin筛选
如果习惯用拼接主键的方式,注意先统一字段类型为字符串,且增加分隔符避免主键碰撞:
# 拼接主键:统一转字符串,中间加下划线做分隔,避免不同字段值拼接后重复 df1["Record"] = df1["Order ID"].astype(str) + "_" + df1["Product ID"].astype(str) df2["Record"] = df2["Order ID"].astype(str) + "_" + df2["Product ID"].astype(str) # 问题1结果:df1里主键不在df2中的记录 res1 = df1[~df1["Record"].isin(df2["Record"])] # 问题2结果:df2里主键不在df1中的记录 res2 = df2[~df2["Record"].isin(df1["Record"])]
注意:拼接主键时必须加分隔符,否则会出现逻辑错误:比如
Order ID=12, Product ID=34和Order ID=1, Product ID=234直接拼接都会得到1234,导致主键匹配完全错误。
内容的提问来源于stack exchange,提问作者user18585713
相关产品推荐
相关产品推荐

