如何将列表内多个DataFrame与主DataFrame批量左连接替代链式merge
实现方案
你可以通过循环迭代或者functools.reduce两种方式实现可扩展的批量左连接,无需手动写链式合并代码。
方案1:循环迭代(易理解,适合需要自定义中间处理的场景)
首先提前整理好每个子DataFrame对应的主表连接键列表,key_list的顺序和df_list的子表顺序一一对应:
import pandas as pd # 准备连接键列表,每个元素对应df_list同位置子表的主表连接键 key_list = ["key_0", "key_1", "key_2"] # 初始化结果为主表 result = df_main.copy() # 迭代批量合并 for df, join_key in zip(df_list, key_list): # 若子表的键列名固定为`Key`,和主表键名不一致,可替换为如下写法: # result = result.merge(df, left_on=join_key, right_on="Key", how="left") result = result.merge(df, on=join_key, how="left")
方案2:reduce归并(代码更简洁)
用functools.reduce实现归并逻辑,一行代码即可完成批量合并:
import pandas as pd from functools import reduce key_list = ["key_0", "key_1", "key_2"] # 归并合并 result = reduce( lambda left, right: left.merge(right[0], on=right[1], how="left"), zip(df_list, key_list), df_main )
注意优化点
如果多个子表的Value列重名,合并后会自动加_x/_y后缀区分,你可以在合并前提前给每个子表的Value重命名避免歧义:
# 合并前批量重命名子表的Value列 for idx, df in enumerate(df_list): df.rename(columns={"Value": f"Value_{idx}"}, inplace=True)
内容的提问来源于stack exchange,提问作者eRawox
相关产品推荐
相关产品推荐

