如何用Pandas找出两DataFrame中ID匹配但其他共有列不匹配的行并剔除OID列
问题描述
给定两个Pandas DataFrame:
import pandas as pd dict1 = [{"ID": "1", "name": "tim", "OID": "12"}, {"ID": "2", "name": "bob", "OID": "22"}, {"ID": "3", "name": "rob", "OID": "33"}, ] dict2 = [{"ID": "1", "name": "tim", "wrongkey": "no", "OID": "12"}, {"ID": "2", "name": "difname", "wrongkey": "no", "OID": "22"}, {"ID": "4", "name": "rob", "wrongkey": "no", "OID": "33"}, ] df1 = pd.DataFrame(data=dict1) df2 = pd.DataFrame(data=dict2)
需要筛选出df2中满足以下条件的行:
- ID与df1中的ID匹配
- 两DataFrame共有的、剔除
OID列之外的列(即name)存在不匹配
最终仅保留ID和name列,期望输出:
ID name 0 2 difname
解决方案
通过合并DataFrame并对比差异的方式实现,步骤如下:
- 提取对比列并合并
提取df1中用于对比的ID和name列,与df2按ID做内连接,确保只保留两个DataFrame中ID匹配的行,同时给df1的name列加后缀区分:
merged_df = df2.merge(df1[['ID', 'name']], on='ID', how='inner', suffixes=('', '_df1'))
- 筛选不匹配的行
对比合并后的name和name_df1列,筛选出内容不一致的行,再只保留ID和name列:
result = merged_df[merged_df['name'] != merged_df['name_df1']][['ID', 'name']].reset_index(drop=True)
- 查看结果
执行print(result)即可得到期望输出:
ID name 0 2 difname
也可以将步骤合并为一行代码:
result = df2.merge(df1[['ID', 'name']], on='ID', how='inner').query('name_x != name_y')[['ID', 'name_x']].rename(columns={'name_x':'name'}).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者ajd018
相关产品推荐
相关产品推荐

