如何连接存在重复行的两个DataFrame并保留重复行?
解决方案:基于全列连接识别行归属并提取指定重复行
我来帮你解决这个问题!结合pandas的功能,我们可以分步骤实现你的需求,包括识别两个DataFrame的共有/独有行,以及单独提取df2中exId=1的重复行,具体操作如下:
1. 先明确数据结构
首先我们先把你提供的两个DataFrame用代码还原出来,方便后续操作:
import pandas as pd # 构建df1 df1 = pd.DataFrame({ 'id': [1, 3], 'amount': [10.00, 90], 'fee': [5.0, 130.0] }) # 构建df2 df2 = pd.DataFrame({ 'exId': [1, 1, 3], 'exAmount': [10.00, 10.0, 90.0], 'exFee': [5.0, 5.0, 130.0] })
2. 对齐列名以便连接
因为两个DataFrame的列名不一致(df1是id/amount/fee,df2是exId/exAmount/exFee),我们先重命名df2的列,让它们和df1匹配:
df2_aligned = df2.rename(columns={ 'exId': 'id', 'exAmount': 'amount', 'exFee': 'fee' })
3. 识别共有行与独有行
使用pd.merge的indicator参数,我们可以标记每行来自哪个DataFrame,从而区分共有、df1独有、df2独有的行:
# 全外连接并标记行来源 merged_result = pd.merge( df1, df2_aligned, on=['id', 'amount', 'fee'], how='outer', indicator=True ) # 拆分不同归属的行 common_rows = merged_result[merged_result['_merge'] == 'both'] # 两个DataFrame共有的行 df1_unique_rows = merged_result[merged_result['_merge'] == 'left_only'] # df1独有的行 df2_unique_rows = merged_result[merged_result['_merge'] == 'right_only'] # df2独有的行
4. 单独提取df2中exId=1的重复行
针对你的核心需求,我们可以用duplicated方法找出df2中所有列完全重复的行,再筛选出exId=1的部分:
# 标记df2中所有列重复的行(keep=False会标记所有重复行,包括第一次出现的) is_duplicate = df2.duplicated(subset=['exId', 'exAmount', 'exFee'], keep=False) # 提取exId=1的重复行 exId1_duplicates = df2[(df2['exId'] == 1) & is_duplicate]
结果验证
你可以通过打印这些变量查看结果:
common_rows会包含id=1和id=3的行(两个DataFrame共有的内容)df1_unique_rows当前是空的(因为df1的行在df2都存在)df2_unique_rows也是空的(df2的行都能在df1找到匹配,除了重复的行,这部分单独在exId1_duplicates里)exId1_duplicates会输出df2中那两行exId=1的重复数据:exId exAmount exFee 0 1 10.0 5.0 1 1 10.0 5.0
内容的提问来源于stack exchange,提问作者Nick01
相关产品推荐
相关产品推荐

