如何合并多个同结构的时序DataFrame?
合并同结构时序DataFrame的正确方式
问题场景
我有一组结构完全一致的时序DataFrame,每个DataFrame包含相同的id数据点,仅utc和temp字段的值不同。示例数据如下:
df1
id name2 geom utc temp 140826 AAA140826 POLYGON ((...)) 2010-07-01T00:00:00.000000000 15.3 140827 AAA140827 POLYGON ((...)) 2010-07-01T00:00:00.000000000 17.3 140828 AAA140828 POLYGON ((...)) 2020-07-01T00:00:00.000000000 10.0
df2
id name2 geom utc temp 140826 AAA140826 POLYGON ((...)) 2010-08-01T00:00:00.000000000 11.3 140827 AAA140827 POLYGON ((...)) 2010-08-01T00:00:00.000000000 10.3 140828 AAA140828 POLYGON ((...)) 2010-08-01T00:00:00.000000000 12.0
df3
id name2 geom utc temp 140826 AAA140826 POLYGON ((...)) 2010-09-01T00:00:00.000000000 13.3 140827 AAA140827 POLYGON ((...)) 2010-09-01T00:00:00.000000000 18.3 140828 AAA140828 POLYGON ((...)) 2010-09-01T00:00:00.000000000 12.0
期望合并后得到按id分组、包含所有时序记录的结果:
id name2 geom utc temp 140826 AAA140826 POLYGON ((...)) 2010-07-01T00:00:00.000000000 15.3 140826 AAA140826 POLYGON ((...)) 2010-08-01T00:00:00.000000000 11.3 140826 AAA140826 POLYGON ((...)) 2010-09-01T00:00:00.000000000 13.0 140827 AAA140827 POLYGON ((...)) 2010-07-01T00:00:00.000000000 17.3 140827 AAA140827 POLYGON ((...)) 2010-08-01T00:00:00.000000000 10.3 140827 AAA140827 POLYGON ((...)) 2010-09-01T00:00:00.000000000 18.0 140828 AAA140828 POLYGON ((...)) 2010-07-01T00:00:00.000000000 10.0 140828 AAA140828 POLYGON ((...)) 2010-08-01T00:00:00.000000000 12.0 140828 AAA140828 POLYGON ((...)) 2010-09-01T00:00:00.000000000 12.0
但用pd.merge逐个合并时,出现错误:Passing 'suffixes' which cause duplicate columns {'temp_x'} is not allowed。
错误原因
pd.merge是用来做横向列合并的工具,适合整合带有不同变量的DataFrame;而你的需求是纵向行堆叠,把所有DataFrame的行整合到一起,用merge完全找错了工具,才会触发列重复的错误。
正确解决方案
用pd.concat()直接纵向拼接所有同结构的DataFrame,代码如下:
import pandas as pd # 将所有需要合并的DataFrame放入列表 dfs = [df1, df2, df3] # 执行纵向拼接,重置索引避免重复 merged_df = pd.concat(dfs, ignore_index=True) # 可选:按id排序,和期望结果结构一致 merged_df = merged_df.sort_values(by='id').reset_index(drop=True)
关键参数说明
ignore_index=True:合并后重置索引,避免保留原DataFrame的重复索引sort_values(by='id'):按id分组排序,让结果和预期结构匹配- 后续新增同结构DataFrame时,直接添加到
dfs列表即可,无需修改拼接逻辑
内容的提问来源于stack exchange,提问作者Gago-Silva
相关产品推荐
相关产品推荐

