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
相关产品推荐
相关产品推荐

