Python Pandas基于多组优先级键合并DataFrame的高效方法咨询
Pandas多优先级顺序合并优化方案
以下是更简洁易维护、性能更优的实现方式:
核心优化点
- 无需手动拼接字符串作为合并键,直接指定多列合并,避免字段拼接带来的潜在匹配冲突,执行效率也更高
- 重复逻辑抽象为循环,后续新增合并规则只需新增键组配置即可,无需重复编写合并、过滤代码
- 全程不修改原始DataFrame,避免意外污染原数据
- 支持提前终止:某轮匹配后只要有一个表没有剩余未匹配行,直接结束流程
实现代码
import pandas as pd # 按优先级从高到低定义合并键组,每组格式为 (df1对应列名列表, df2对应列名列表) merge_key_groups = [ (['SUBJECT', 'VISIT', 'TIME'], ['Subject', 'VISIT', 'TIME']), (['SUBJECT', 'VISIT', 'TIMEPOINT'], ['Subject', 'VISIT', 'TIMEPOINT']), (['SUBJECT', 'DATE', 'TIME'], ['Subject', 'DATE', 'TIME']), (['SUBJECT', 'DATE', 'TIMEPOINT'], ['Subject', 'DATE', 'TIMEPOINT']) ] # 初始化剩余未匹配数据,不修改原df left_remain = df1.copy() right_remain = df2.copy() # 存储每一轮匹配成功的结果 matched_parts = [] for left_keys, right_keys in merge_key_groups: # 本轮内连接匹配 current_matched = pd.merge( left_remain, right_remain, how='inner', left_on=left_keys, right_on=right_keys ) matched_parts.append(current_matched) # 过滤左表已匹配行 left_remain = left_remain.merge( current_matched[left_keys].drop_duplicates(), how='left', on=left_keys, indicator=True ).query('_merge == "left_only"').drop(columns='_merge') # 过滤右表已匹配行 right_remain = right_remain.merge( current_matched[right_keys].drop_duplicates(), how='left', on=right_keys, indicator=True ).query('_merge == "left_only"').drop(columns='_merge') # 提前终止 if len(left_remain) == 0 or len(right_remain) == 0: break # 按需取用结果: # 对应原逻辑的part_one ~ part_four:matched_parts[0] ~ matched_parts[3] # 所有匹配成功的结果:pd.concat(matched_parts, ignore_index=True) # 最终未匹配的行:left_remain(原left_df1)、right_remain(原left_df2)
内容的提问来源于stack exchange,提问作者Senpie
相关产品推荐
相关产品推荐

