如何按时间顺序合并不同时间维度、不同大小的DataFrame?
Pandas合并两个含不同时间的DataFrame并按时间排序
你的问题出在没有指定合并键且未对结果排序。直接用how='outer'但不指定on参数时,Pandas虽然会基于共同列做外连接,但不会自动按你需要的run_id+time顺序排列,导致结果是原DataFrame的行堆叠。
正确实现步骤
- 基于
run_id和time两个列做外连接,保留所有行和列,无匹配的位置填充NaN; - 按
run_id分组,再按time升序排序,得到你要的时间顺序结果。
完整代码
import pandas as pd # 构造示例数据(替换成你自己的DataFrame即可) df1 = pd.DataFrame({ 'time': [0,24,48,0,24,48], 'run_id': ['H1','H1','H1','H2','H2','H2'], 'weight': [500,400,300,900,800,700] }) df2 = pd.DataFrame({ 'time': [0.5,10,40,60,0.5,5,35,70], 'run_id': ['H1','H1','H1','H1','H2','H2','H2','H2'], 'totalizer': [100,200,300,400,900,1000,1100,1200] }) # 外连接+排序 merged_df = pd.merge(df1, df2, on=['run_id', 'time'], how='outer') merged_df = merged_df.sort_values(by=['run_id', 'time']).reset_index(drop=True) # 可选:将NaN转为空字符串(匹配你期望的显示效果) merged_df = merged_df.fillna('') print(merged_df)
输出结果
| time | run_id | weight | totalizer | |
|---|---|---|---|---|
| 0 | 0 | H1 | 500 | |
| 1 | 0.5 | H1 | 100 | |
| 2 | 10 | H1 | 200 | |
| 3 | 24 | H1 | 400 | |
| 4 | 40 | H1 | 300 | |
| 5 | 48 | H1 | 300 | |
| 6 | 60 | H1 | 400 | |
| 7 | 0 | H2 | 900 | |
| 8 | 0.5 | H2 | 900 | |
| 9 | 5 | H2 | 1000 | |
| 10 | 24 | H2 | 800 | |
| 11 | 35 | H2 | 1100 | |
| 12 | 48 | H2 | 700 | |
| 13 | 70 | H2 | 1200 |
关键说明
pd.merge的on=['run_id', 'time']确保同一run_id下的同一时间行会合并,不同时间的行各自保留;sort_values(by=['run_id', 'time'])先按实验分组(H1/H2),再按时间从小到大排序,完全匹配你的需求;- 若不需要
NaN,可以用fillna('')转为空字符串,贴合你给出的期望格式。
内容的提问来源于stack exchange,提问作者wew044
相关产品推荐
相关产品推荐

