如何用Pandas找出两DataFrame中指定列同值但其他列异值的行
解决两个DataFrame中匹配col1+col4但col2/col3不同的行问题
我来帮你搞定这个需求,核心是找出两个DataFrame中col1+col4组合完全相同,但col2或col3存在差异的所有行,最终合并输出这些行。下面是用Pandas实现的具体步骤和代码:
第一步:准备样本数据
先把你给出的样本数据转换成可运行的Pandas DataFrame:
import pandas as pd # 构建样本df1 df1 = pd.DataFrame({ 'col1': ['a', 'b'], 'col2': ['bb', 'aa'], 'col3': ['cc', 'ee'], 'col4': ['d', 'e'] }) # 构建样本df2 df2 = pd.DataFrame({ 'col1': ['a', 'e'], 'col2': ['ee', 'gg'], 'col3': ['ff', 'hh'], 'col4': ['d', 'k'] })
第二步:筛选并生成目标结果
核心思路是先定位col1+col4相同但col2/col3不同的组合,再从原DataFrame中提取对应行:
# 内连接两个df,用后缀区分来自不同df的列 merged = pd.merge(df1, df2, on=['col1', 'col4'], suffixes=('_df1', '_df2')) # 筛选col2或col3不一致的行,得到目标(col1, col4)组合 mismatched = merged[(merged['col2_df1'] != merged['col2_df2']) | (merged['col3_df1'] != merged['col3_df2'])] target_pairs = mismatched[['col1', 'col4']] # 从原df1和df2中提取对应行,合并成结果df3 df3 = pd.concat([ df1.merge(target_pairs, on=['col1', 'col4']), df2.merge(target_pairs, on=['col1', 'col4']) ]).reset_index(drop=True) # 输出结果 print(df3)
运行结果
执行上述代码后,输出的df3完全符合你的期望:
col1 col2 col3 col4 0 a bb cc d 1 a ee ff d
代码逻辑解释
- 内连接:通过
pd.merge基于col1和col4合并两个DataFrame,只保留两个df中都存在的col1+col4组合,方便后续对比列值差异。 - 筛选差异行:用
|(逻辑或)判断col2或col3是否存在不一致,锁定需要提取的目标组合。 - 提取合并:从原df1和df2中分别提取目标组合对应的行,再用
pd.concat合并成最终结果。
内容的提问来源于stack exchange,提问作者Tuyen Quang
相关产品推荐
相关产品推荐

