如何纵向合并多个DataFrame并同步添加源数据集ID列
Pandas 多DataFrame纵向合并同时新增来源标记列实现方案
方案1:pd.concat原生参数一步实现(推荐,不修改原始数据)
直接利用pandas合并函数自带的keys参数生成标记,不需要提前修改任何原始DataFrame,代码最简洁:
import pandas as pd # 按你需要的合并顺序,把所有待合并的DataFrame存入列表 df_to_merge = [df1, df2, df3] # 一步完成合并+标记列生成 merged_df = pd.concat( df_to_merge, keys=range(1, len(df_to_merge)+1), # 按顺序生成1、2、3...的标记值,和列表里的df一一对应 names=["source_id"] # 标记列的列名,可根据需求自定义 ).reset_index(level="source_id").reset_index(drop=True)
参数说明:第一次
reset_index是把concat生成的多层索引中的来源标记提取为普通列,第二次reset_index(drop=True)是重置合并后DataFrame的行索引,避免原始df的索引重复;如果需要保留原始df的行索引,去掉第二次reset_index即可。
方案2:预加列后合并(逻辑直观,适合自定义标记规则)
如果后续需要调整标记规则(比如用DataFrame名称、自定义业务标签代替数字序号),可以先给每个df加完标记列再合并,逻辑更易修改:
import pandas as pd df_to_merge = [df1, df2, df3] # 遍历给每个df新增标记列,start=1保证序号从1开始计数 for seq, df in enumerate(df_to_merge, start=1): df["source_id"] = seq # 直接纵向合并即可,ignore_index=True自动重置行索引 merged_df = pd.concat(df_to_merge, ignore_index=True)
注意:该方法会直接修改你原始的df1、df2、df3,给它们新增source_id列,如果不想改动原始数据,可以在循环里用df = df.copy()先复制副本再操作。
效果验证
举个最简测试用例:
df1 = pd.DataFrame({"value": [1,2]}) df2 = pd.DataFrame({"value": [3,4]}) df3 = pd.DataFrame({"value": [5,6]})
用上述任意一种方法合并后,结果如下,完全符合“同一原始df的行标记相同、序号按顺序从1递增”的要求:
| source_id | value |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 2 | 3 |
| 2 | 4 |
| 3 | 5 |
| 3 | 6 |
内容的提问来源于stack exchange,提问作者SimonDL
相关产品推荐
相关产品推荐

