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

Python中合并多个DataFrame并添加数据源标识列的方法

解决方法

一、用字典存储DataFrame(推荐,最可靠)

如果还没把DataFrame放进列表,直接用字典保存每个DataFrame和它的名称——键是原DataFrame的名称,值是DataFrame对象。这样后续合并时完全不需要手动维护keys参数。

1. 先构建字典

# 示例:替换成你的实际变量名
df_dict = {
    "df_shop1": df_shop1,
    "df_shop2": df_shop2,
    "df_shop3": df_shop3,
    # ... 剩下14个DataFrame
}

2. 合并并添加Dataframe_name列

遍历字典,给每个DataFrame新增一列存储它的名称,再合并:

import pandas as pd

combined_df = pd.concat(
    [df.assign(Dataframe_name=name) for name, df in df_dict.items()],
    ignore_index=True
)

3. 或把名称作为多级索引

如果想把原名称作为索引的一部分,直接用concat的keys参数(字典的键会自动作为keys):

combined_df = pd.concat(df_dict.values(), keys=df_dict.keys(), names=["Dataframe_name", "original_index"])

二、如果已经有frames列表(反向获取原变量名)

如果你已经把DataFrame存在列表里,想反向获取它们的原变量名,可以用inspect模块读取当前作用域的变量映射。但这个方法有局限性(比如动态生成的DataFrame可能无法获取名称),仅适合手动定义的变量。

1. 编写函数获取列表中DataFrame的名称

import pandas as pd
import inspect

def get_df_original_names(df_list):
    # 获取调用者的作用域
    caller_frame = inspect.currentframe().f_back
    # 构建DataFrame对象ID到变量名的映射
    id_to_name = {
        id(var): name 
        for name, var in caller_frame.f_locals.items() 
        if isinstance(var, pd.DataFrame)
    }
    # 按列表顺序返回对应名称
    return [id_to_name[id(df)] for df in df_list]

2. 合并并添加名称列

# 获取每个DataFrame的原名称
df_names = get_df_original_names(frames)

# 合并时添加列
combined_df = pd.concat(
    [df.assign(Dataframe_name=name) for df, name in zip(frames, df_names)],
    ignore_index=True
)

注意事项

  • 字典方法是最优解:列表本身只存储对象引用,不保留变量名,用字典主动存储名称和DataFrame的映射,完全避免手动维护keys的麻烦。
  • inspect方法的局限性:如果DataFrame是通过循环、函数返回等动态生成的(没有明确的变量名),这个方法无法获取名称,此时建议在生成DataFrame时就用字典存储。

内容的提问来源于stack exchange,提问作者lilqasr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:55:24