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

基于分组反向排序合并两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:39:27