如何按Time重塑Pandas DataFrame并生成目标格式的新DataFrame?
Pandas按Time排序并调整列顺序的实现方案
原始DataFrame
首先定义初始DataFrame:
import pandas as pd df = pd.DataFrame({'unit':[1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3], 'time':[1, 2, 3, 4, 5, 1, 2, 3, 1, 2, 3, 4], 'signals': [23.2, 23.4, 23.3, 23.5, 23.4, 22.1, 22.3, 22.4, 23.8, 23.9, 24.1, 24.0]})
对应的表格:
| unit | time | signals |
|---|---|---|
| 1 | 1 | 23.2 |
| 1 | 2 | 23.4 |
| 1 | 3 | 23.3 |
| 1 | 4 | 23.5 |
| 1 | 5 | 23.4 |
| 2 | 1 | 22.1 |
| 2 | 2 | 22.3 |
| 2 | 3 | 22.4 |
| 3 | 1 | 23.8 |
| 3 | 2 | 23.9 |
| 3 | 3 | 24.1 |
| 3 | 4 | 24.0 |
目标格式
需要得到按time分组排序、且列顺序为time→unit→signals的DataFrame:
| time | unit | signals |
|---|---|---|
| 1 | 1 | 23.2 |
| 1 | 2 | 22.1 |
| 1 | 3 | 23.8 |
| 2 | 1 | 23.4 |
| 2 | 2 | 22.3 |
| 2 | 3 | 23.9 |
| 3 | 1 | 23.3 |
| 3 | 2 | 22.4 |
| 3 | 3 | 24.1 |
| 4 | 1 | 23.5 |
| 4 | 3 | 24.0 |
| 5 | 1 | 23.4 |
原尝试的问题
使用groupby方法无法直接得到目标结果:
new_df = df.groupby('time') new_df.apply(lambda x: print(x))
存在两个问题:
- 无法直接交换
time和unit列的位置 groupby返回的是分组对象,不能直接生成符合结构的DataFrame
解决方案
不需要使用groupby,通过排序+列重排即可快速实现:
分步实现
# 先按time升序排序,同一time下按unit升序排序 sorted_df = df.sort_values(by=['time', 'unit']) # 调整列顺序为time、unit、signals target_df = sorted_df[['time', 'unit', 'signals']].reset_index(drop=True)
合并简化
可以将两步合并为一行代码:
target_df = df.sort_values(by=['time', 'unit'])[['time', 'unit', 'signals']].reset_index(drop=True)
关键说明
sort_values(by=['time', 'unit']):先按time分组排序,同一time内按unit排序,完全匹配目标的行顺序[['time', 'unit', 'signals']]:直接指定列的顺序,完成time和unit的位置交换reset_index(drop=True):重置索引,清除原DataFrame的旧索引(如果不需要保留原索引可省略)
内容的提问来源于stack exchange,提问作者IMRGEB
相关产品推荐
相关产品推荐

