如何使用Pandas基于时间戳列合并两个仅共享该列的DataFrame
基于时间戳的Pandas DataFrame合并实现
你需要的合并逻辑本质是连接键完全匹配的全外连接,之前的尝试选了错误的连接方式和工具,调整参数即可实现完全匹配需求的输出。
核心实现代码
直接使用pandas.merge指定全外连接模式即可,缺失值会自动填充为NaN:
merged_df = pd.merge( left=gt, right=svo, on="time", # 两表唯一的共享列作为连接键 how="outer" # 取两表所有time值的并集,保留全部时间点 ) # 按时间戳升序排序,重置索引匹配示例输出的顺序 merged_df = merged_df.sort_values("time").reset_index(drop=True)
运行后得到的结果和你给出的预期输出完全一致:
time gt_x gt_y gt_z svo_x svo_y svo_z 0 1.5 50.0 60.0 70.0 11.1 13.2 17.3 1 2.0 55.0 65.0 75.0 NaN NaN NaN 2 2.5 NaN NaN NaN 7.4 34.5 23.6 3 3.0 57.5 67.5 77.5 NaN NaN NaN 4 3.5 NaN NaN NaN 15.7 32.8 19.9
之前尝试失败的常见原因
- 选用
inner连接模式:只会保留两个表共有的时间戳,本场景下仅能匹配到1.5这一行的结果,完全不符合“保留所有时间点”的需求 - 误用
merge_asof:该工具的设计逻辑是为左表每一行匹配右表中最近邻的小于/等于键值的行,不是严格按键值相等匹配,会强制做时间邻近对齐,自然无法实现精确时间戳匹配的效果
等效备选方案
如果习惯以索引为连接基准,也可以将time列设为索引后用join方法实现,最终结果和上述代码完全一致:
merged_df = gt.set_index("time").join(svo.set_index("time"), how="outer") # 将索引中的time转回普通列,对齐结构 merged_df = merged_df.reset_index().sort_values("time").reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Yuerno
相关产品推荐
相关产品推荐

