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

如何在Pandas中合并含冗余行的DataFrame(多列重叠场景)

解决DataFrame合并问题:匹配重叠键并保留多重复记录

你需要把两个结构有差异但存在重叠键的DataFrame合并,让df1里的c值对应到df2中每个相同键组合的行上对吧?我来一步步给你实现:

首先得明确两个DataFrame的匹配逻辑:

  • df1里的X列对应df2的a列
  • df1里的Y列对应df2每行的第二个值(比如1)
  • df1里的第五列(数值21、22那些)对应df2每行的第三个值(比如21)

步骤1:整理df1的结构

先给df1补全正确的列名,再筛选出我们需要的键列和c列:

import pandas as pd

# 构造你提供的df1
df1 = pd.DataFrame({
    'X': ['A', 'B', 'C', 'D', 'E'],
    'unused1': ['P', 'P', 'P', 'P', 'P'],
    'Y': [1, 2, 3, 4, 5],
    'unused2': ['Q', 'Q', 'Q', 'Q', 'Q'],
    'b_part2': [21, 22, 23, 24, 25],
    'c': [1.135899, 1.093204, 2.035373, 0.350060, -0.939962]
})

# 重命名并保留需要的列
df1_clean = df1.rename(columns={'X': 'a', 'Y': 'b_part1'}).loc[:, ['a', 'b_part1', 'b_part2', 'c']]

步骤2:构造并整理df2

同样给df2补全列名,确保键列和df1对齐:

# 构造你提供的df2
df2 = pd.DataFrame({
    'a': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'],
    'b_part1': [1, 1, 1, 2, 2, 3, 3, 3],
    'b_part2': [21, 21, 21, 22, 22, 23, 23, 23],
    'd': [5.5, 3.3, 2.1, 0.8, 0.5, 1.3, 6.5, 7.1]
})

步骤3:合并两个DataFrame

用pd.merge()做内连接(只保留两个表都有的键组合,也就是A、B、C),因为df2同一个键组合有多行,merge后会自动把df1的c值重复填充到对应行:

# 按共同键合并
df3 = pd.merge(df2, df1_clean, on=['a', 'b_part1', 'b_part2'], how='inner')

# 如果需要把b_part1和b_part2合并成一个列(像你期望的"1 21"格式),可以加这一步:
df3['b'] = df3['b_part1'].astype(str) + ' ' + df3['b_part2'].astype(str)
# 调整列顺序到你想要的样子
df3 = df3.loc[:, ['a', 'b', 'c', 'd']]

最终结果

运行后得到的df3就是你想要的格式:

a     b         c    d
0  A  1 21  1.135899  5.5
1  A  1 21  1.135899  3.3
2  A  1 21  1.135899  2.1
3  B  2 22  1.093204  0.8
4  B  2 22  1.093204  0.5
5  C  3 23  2.035373  1.3
6  C  3 23  2.035373  6.5
7  C  3 23  2.035373  7.1

核心就是先对齐两个表的匹配键,再通过merge让df1的单行记录自动对应到df2的多行同键记录上,完成值的重复填充。

内容的提问来源于stack exchange,提问作者honeymoon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:04:47