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

如何用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并对比差异的方式实现,步骤如下:

  1. 提取对比列并合并
    提取df1中用于对比的ID和name列,与df2按ID做内连接,确保只保留两个DataFrame中ID匹配的行,同时给df1的name列加后缀区分:
merged_df = df2.merge(df1[['ID', 'name']], on='ID', how='inner', suffixes=('', '_df1'))
  1. 筛选不匹配的行
    对比合并后的name和name_df1列,筛选出内容不一致的行,再只保留ID和name列:
result = merged_df[merged_df['name'] != merged_df['name_df1']][['ID', 'name']].reset_index(drop=True)
  1. 查看结果
    执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 19:08:23