如何在多个Pandas DataFrame上循环执行Merge操作?
批量合并多个Pandas DataFrame的优化方案
问题背景
有多个Pandas DataFrame(如df1、df2),需要和同一个关联表key_df执行相同的合并操作,最终得到每个原DataFrame关联后的结果。现有实现方式是将所有DataFrame存入列表,合并后再从列表中提取,操作繁琐,希望找到更高效直观的实现方法。
现有数据代码:
import pandas as pd data_1 = [[1, "Sarah"], [2, "Kevin"], [3, "Mark"]] data_2 = [[1, "Bart"], [5, "Nina"], [4, "John"]] df1 = pd.DataFrame(data_1, columns=["Floor", "Name"]) df2 = pd.DataFrame(data_2, columns=["Floor", "Name"]) key = [[1, "Security"], [2, "HR"], [3, "Finance"], [4, "Marketing"], [5, "R&D"]] key_df = pd.DataFrame(key, columns=["Floor", "Dept"])
现有合并代码(痛点:需从列表提取结果):
all_df = [df1, df2] all_merge = [] for df in all_df: df_merge = df.merge(key_df) all_merge.append(df_merge)
优化方案
方案1:原地更新原DataFrame
如果希望直接修改原变量(df1、df2),可以通过索引循环列表,将合并结果直接赋值回原位置,无需额外提取:
all_df = [df1, df2] for i in range(len(all_df)): all_df[i] = all_df[i].merge(key_df) # 此时原变量已更新 df1, df2 = all_df[0], all_df[1]
优点:直接复用原变量名,无需维护新的列表或字典;缺点:若DataFrame数量较多,手动解包变量会比较麻烦。
方案2:用字典管理DataFrame(推荐)
将所有需要合并的DataFrame存入字典,循环处理后直接通过字典键调用结果,逻辑更清晰,尤其适合DataFrame数量较多的场景:
# 用字典存储原DataFrame dfs = {"df1": df1, "df2": df2} # 循环执行合并并更新字典 for name, df in dfs.items(): dfs[name] = df.merge(key_df) # 调用结果 df1_merged = dfs["df1"] df2_merged = dfs["df2"]
优点:通过键名直接关联原DataFrame和合并结果,可读性高,便于后续维护;缺点:需要额外创建字典结构,但成本极低。
方案3:列表推导式简化原代码
如果仍偏好列表存储,用列表推导式可以大幅简化代码,比原循环更简洁:
all_merge = [df.merge(key_df) for df in [df1, df2]] # 提取结果 df1, df2 = all_merge
优点:代码简洁,一行完成合并;缺点:本质和原方法类似,仍需提取结果,但写法更高效。
方案4:直接批量合并后拆分(进阶)
如果所有原DataFrame结构一致,可以先将它们纵向合并,一次性关联key_df,再按原DataFrame拆分:
# 给每个DataFrame添加标识列 df1["source"] = "df1" df2["source"] = "df2" # 纵向合并所有DataFrame combined = pd.concat([df1, df2], ignore_index=True) # 一次性关联key_df combined_merged = combined.merge(key_df) # 拆分回原DataFrame df1_merged = combined_merged[combined_merged["source"] == "df1"].drop("source", axis=1).reset_index(drop=True) df2_merged = combined_merged[combined_merged["source"] == "df2"].drop("source", axis=1).reset_index(drop=True)
优点:减少多次合并的重复操作,适合DataFrame数量极多的场景;缺点:需要添加临时标识列,步骤稍多。
内容的提问来源于stack exchange,提问作者be84
相关产品推荐
相关产品推荐

