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

Pandas识别两表Order ID+Product ID差集及TypeError报错解决

参考数据集
  • Data1 样例:
    data1示例截图
  • Data2 样例:
    data2示例截图

两个数据集均以 Order ID + Product ID 组合作为主键,单个数据集内不存在该主键组合重复的记录。

问题说明
  • 问题1:识别存在于Data1、但缺失于Data2的主键组合对应记录
  • 问题2:识别缺失于Data1、但存在于Data2的主键组合对应记录
原有代码报错原因

原代码抛出TypeError: unsupported operand type(s) for -: 'str' and 'int'的核心原因:

  1. 逻辑选型错误:subtract是针对数值字段做减法运算的方法,而两个DataFrame中存在大量字符串类型的业务字段,根本不支持和fill_value指定的数值0做减法运算,完全不匹配「匹配主键找差集」的需求。
  2. 主键拼接存在类型隐患:直接用+连接两个字段时,如果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 22:06:18