如何对比两个DataFrame,仅输出完全不匹配的ID对应数据?
问题需求
我有两个DataFrame,需要对比二者并输出仅在df1中完全无匹配对应项的数据。具体要求是:同一id在df1中有多个值、且df2中存在部分匹配时,不将该id视为不匹配项。
示例数据
df1:
| id | check_column1 |
|---|---|
| 21 | abc |
| 21 | bcd |
| 22 | hqo |
| 22 | hsd |
| 23 | mno |
df2:
| id | check_column1 |
|---|---|
| 21 | abc |
| 22 | hqo |
| 23 | xyz |
期望输出
| id | check_column1 | check_column2 |
|---|---|---|
| 23 | mno | xyz |
我尝试了以下代码,但它会返回所有不匹配项,不符合需求:
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
相关产品推荐
相关产品推荐

