如何在reduce函数中使用动态列名合并多个pandas dataframe
实现方案
核心思路:因为每次合并的关联列不固定,我们可以把每个待合并的DataFrame和对应的关联参数打包成配置项,和reduce逻辑结合即可实现动态合并。
完整代码实现
import pandas as pd from functools import reduce def dynamic_merge(base_df, merge_configs, default_how="outer"): """ 动态多表合并函数 :param base_df: 初始基准表(对应你的df1) :param merge_configs: 合并配置列表,每个元素格式为 (待合并df, left_on列名, right_on列名, [合并方式how]) 若未指定how则使用default_how参数 :param default_how: 默认合并方式,未单独指定how时生效 :return: 最终合并完成的DataFrame """ return reduce( lambda merged_df, config: pd.merge( left=merged_df, right=config[0], left_on=config[1], right_on=config[2], how=config[3] if len(config)>=4 else default_how ), merge_configs, base_df # reduce的初始值设为基准表df1 )
使用示例
对应你给出的场景,调用方式如下:
# 构造合并配置:每个元组对应一次和基准表的合并规则 merge_configs = [ (df2, "Dim1", "Example1"), # 用Dim1关联Example1合并df2,默认outer (df3, "Dim2", "Other1", "inner") # 用Dim2关联Other1合并df3,单独指定合并方式为inner # 后续要加第4到第20个表,直接在列表里加对应配置即可 ] # 执行合并 final_df = dynamic_merge(base_df=df1, merge_configs=merge_configs)
逻辑说明
- reduce的初始值设为你的基准表
df1,不需要把df1放到待合并列表里 - 每次迭代时会按配置里的关联列完成当前表的合并,支持20个甚至更多表的合并需求
- 支持全局统一合并方式,也支持单表单独指定合并方式,灵活性更高
- 如果某次合并的左右关联列名相同,直接给
left_on和right_on传相同的列名即可,兼容所有合并场景
内容的提问来源于stack exchange,提问作者matt.aurelio
相关产品推荐
相关产品推荐

