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

如何对比两个DataFrame,仅输出完全不匹配的ID对应数据?

问题需求

我有两个DataFrame,需要对比二者并输出仅在df1中完全无匹配对应项的数据。具体要求是:同一id在df1中有多个值、且df2中存在部分匹配时,不将该id视为不匹配项。

示例数据

df1:

idcheck_column1
21abc
21bcd
22hqo
22hsd
23mno

df2:

idcheck_column1
21abc
22hqo
23xyz

期望输出

idcheck_column1check_column2
23mnoxyz

我尝试了以下代码,但它会返回所有不匹配项,不符合需求:

df = pd.merge(df1,df2,left_on =['id',df1.groupby('id').cumcount()], right_on = ['id',df2.groupby('id').cumcount()] )

解决方案

思路

先筛选出在df1和df2中,该id下没有任何匹配的check_column1值的id,再对这些id进行合并操作,得到目标结果。

代码实现

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({'id': [21,21,22,22,23], 'check_column1': ['abc','bcd','hqo','hsd','mno']})
df2 = pd.DataFrame({'id': [21,22,23], 'check_column1': ['abc','hqo','xyz']})

# 1. 找出所有存在至少一个匹配项的id
matched_ids = pd.merge(df1, df2, on=['id', 'check_column1'])['id'].unique()

# 2. 筛选出完全无匹配的id对应的数据
df1_filtered = df1[~df1['id'].isin(matched_ids)]
df2_filtered = df2[~df2['id'].isin(matched_ids)]

# 3. 合并数据并重命名列
result = pd.merge(df1_filtered, df2_filtered, on='id', suffixes=('', '_2')).rename(columns={'check_column1_2': 'check_column2'})

print(result)

输出结果

id check_column1 check_column2
0  23           mno           xyz

代码解释

  • pd.merge(df1, df2, on=['id', 'check_column1']) 会定位所有id和check_column1完全匹配的行,提取这些行的id得到matched_ids——也就是那些存在至少一个有效匹配的id。
  • ~df1['id'].isin(matched_ids) 用于反向筛选,保留完全没有匹配项的id对应的数据。
  • 最后合并筛选后的两个DataFrame,通过重命名列区分来源,得到符合要求的输出格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:05:21