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

如何在多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:33:12