Python Pandas:如何按Timestamp合并存在差异的两个DataFrame
解决Timestamp列部分差异的DataFrame合并问题
你遇到的问题核心是用错了方法——concatenate是用来简单堆叠数据的,没办法处理基于特定列的匹配合并。你需要的是基于Timestamp列的外连接(outer join),这样能保留两个DataFrame里所有的Timestamp值,匹配上的行合并,没匹配上的自动补NaN,正好符合你的预期结果。
具体实现代码
先看完整的可运行示例:
import pandas as pd # 构造你的示例数据 # df1数据 data1 = { 'Timestamp': ['2019-10-25 10:39:58.352073', '2019-10-25 10:40:06.266782', '2019-10-25 16:35:22.485574', '2019-10-27 09:50:31.713192', '2019-10-28 14:04:33.095633', '2019-10-28 14:05:07.639344'], 'Flag': ['begin', 'end', 'begin', 'end', 'begin', 'end'], 'Group': ['prod', 'prod', 'clean', 'clean', 'transport', 'transport'] } df1 = pd.DataFrame(data1) # df2数据 data2 = { 'Timestamp': ['2019-10-25 10:39:58.352073', '2019-10-25 10:40:06.266782', '2019-10-25 16:35:22.485574', '2019-10-25 17:00:00.000000', '2019-10-26 07:00:00.000000', '2019-10-26 17:00:00.000000', '2019-10-27 07:00:00.000000', '2019-10-27 09:50:31.713192', '2019-10-28 14:04:33.095633', '2019-10-28 14:05:07.639344'] } df2 = pd.DataFrame(data2) # 关键:用merge做外连接,以df2为左表保证顺序 merged_df = pd.merge(df2, df1, on='Timestamp', how='outer') # 输出结果 print(merged_df)
代码解释
pd.merge(df2, df1, on='Timestamp', how='outer'):how='outer':指定外连接,会保留两个DataFrame中所有的Timestamp值,不管是否在对方存在on='Timestamp':明确用Timestamp列作为匹配的键- 把df2放在左表位置,这样合并后的行顺序会和df2的原始顺序一致,完全符合你期望的结果
为什么concatenate不行?
pd.concat()的作用是把两个DataFrame按行/列堆叠,不会做任何匹配逻辑。如果直接用它合并,会出现重复的Timestamp行,而且df1的Flag/Group列无法对应到df2中匹配的Timestamp上,这就是你遇到唯一性问题的根源——concat根本不是用来做这种匹配合并的工具。
额外优化建议
如果你的Timestamp列目前是字符串类型,建议先转换成datetime类型,这样能避免字符串格式细微差异导致的匹配失败:
df1['Timestamp'] = pd.to_datetime(df1['Timestamp']) df2['Timestamp'] = pd.to_datetime(df2['Timestamp'])
内容的提问来源于stack exchange,提问作者Zebra125
相关产品推荐
相关产品推荐

