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

如何连接存在重复行的两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:10:33