如何在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
相关产品推荐
相关产品推荐

