基于分组反向排序合并两个DataFrame并关联对应列
分组排序后匹配合并DataFrame的实现方案
核心就是靠分组内的排序位置来做匹配,把df2的列对应到df1里,完全保留df1的结构,匹配不上的就填NA。具体步骤和代码如下:
操作步骤
- 给df1按ColA、ColB分组,ColD升序排序,每组内加个从1开始的序号,标记每行在组内的位置
- 给df2按ColA2、ColB2分组,ColD2降序排序,同样加组内序号,同时把ColA2、ColB2改名叫ColA、ColB,方便后续匹配
- 用ColA、ColB加上组内序号当匹配键,把df2的ColD2、ColC2合并到df1里,最后删掉临时加的序号列
代码示例(Pandas)
import pandas as pd # 示例数据,替换成你自己的即可 df1 = pd.DataFrame({ 'ColA': ['A', 'A', 'B', 'B', 'B'], 'ColB': ['X', 'X', 'Y', 'Y', 'Y'], 'ColC': ['C1', 'C2', 'C3', 'C4', 'C5'], 'ColD': [10, 20, 5, 15, 25] }) df2 = pd.DataFrame({ 'ColA2': ['A', 'A', 'B', 'B'], 'ColB2': ['X', 'X', 'Y', 'Y'], 'ColC2': ['C21', 'C22', 'C23', 'C24'], 'ColD2': [200, 100, 250, 150] }) # 给df1添加组内排序序号 df1['group_rank'] = df1.groupby(['ColA', 'ColB'])['ColD'].rank(method='first', ascending=True).astype(int) # 处理df2:重命名分组列 + 添加组内降序序号 df2_processed = df2.copy() df2_processed.rename(columns={'ColA2': 'ColA', 'ColB2': 'ColB'}, inplace=True) df2_processed['group_rank'] = df2_processed.groupby(['ColA', 'ColB'])['ColD2'].rank(method='first', ascending=False).astype(int) # 只保留需要合并的列,减少冗余数据 df2_processed = df2_processed[['ColA', 'ColB', 'group_rank', 'ColD2', 'ColC2']] # 左合并,完全保留df1原有结构 result = pd.merge(df1, df2_processed, on=['ColA', 'ColB', 'group_rank'], how='left') # 删除临时添加的序号列 result.drop('group_rank', axis=1, inplace=True) print(result)
重点说明
- 用
rank(method='first')是为了避免ColD/ColD2出现重复值时,序号重复导致匹配混乱,保证每行都有唯一的组内位置标记 how='left'是核心参数,确保df1的所有行都被保留,匹配失败的位置自动填充NA- 重命名df2的分组列是为了统一合并键,简化匹配逻辑,不用额外指定复杂的列对应关系
内容的提问来源于stack exchange,提问作者Connie Xu
相关产品推荐
相关产品推荐

