Pandas - 重塑数据框
Pandas - Reshape Dataframe
我有以下数据框:
Time AreaIn AreaOut Output
0 1 Area E Area G 200
1 16 Area E Area G 200
2 31 Area E Area G 200
3 46 Area E Area G 300
4 61 Area E Area G 459
5 ... ... ... ...
93 1396 Area E Area G 600
94 1411 Area E Area G 400
95 1426 Area E Area G 500
96 1441 Area E Area G 500
97 1 Area H Area F 600
98 16 Area H Area F 600
99 31 Area H Area F 600
100 46 Area H Area F 600
101 61 Area H Area F 116
102 ... ... ... ...
189 1381 Area H Area F 111
190 1396 Area H Area F 600
191 1411 Area H Area F 600
192 1426 Area H Area F 400
193 1441 Area H Area F 400
我想重塑它。 'Time' 列的范围为 1 到 1441,间隔为 15,但我希望它的范围为 1 到 1441,间隔为 60。而 'Output' 应该是每 4 行的平均值(每 4 行的总和除以 4)。
在这种情况下,数据帧仅包含两个时间序列,因此结果应如下所示:
Time AreaIn AreaOut Output
0 1 Area E Area G 450
1 61 Area E Area G 500
2 121 Area E Area G 600
3 181 Area E Area G 892
4 241 Area E Area G 459
5 ... ... ... ...
21 1261 Area E Area G 810
22 1321 Area E Area G 598
23 1381 Area E Area G 650
24 1441 Area E Area G 250
25 1 Area H Area F 600
26 61 Area H Area F 987
27 121 Area H Area F 0
28 181 Area H Area F 211
29 241 Area H Area F 116
30 ... ... ... ...
44 1201 Area H Area F 111
45 1261 Area H Area F 332
46 1321 Area H Area F 551
47 1381 Area H Area F 726
49 1441 Area H Area F 250
但是,我想实现一个可以处理两个以上时间序列的通用解决方案。
使用时:df = df.groupby(pd.cut(df["Time"], np.arange(1, 1442, 60))).mean()
我得到以下结果:
Time Output
Time
(1, 61] 38.5 2351
(61, 121] 98.5 2752
(121, 181] 158.5 4323
(181, 241] 218.5 2523
(241, 301] 278.5 3456
(301, 361] 338.5 1653
(361, 421] 398.5 4361
(421, 481] 458.5 6543
(481, 541] 518.5 3245
(541, 601] 578.5 2434
(601, 661] 638.5 1387
(661, 721] 698.5 4456
(721, 781] 758.5 2534
(781, 841] 818.5 3424
(841, 901] 878.5 2376
(901, 961] 938.5 2656
(961, 1021] 998.5 3456
(1021, 1081] 1058.5 1212
(1081, 1141] 1118.5 3355
(1141, 1201] 1178.5 2466
(1201, 1261] 1238.5 3462
(1261, 1321] 1298.5 2344
(1321, 1381] 1358.5 2453
(1381, 1441] 1418.5 3256
它将两个不同时间序列的输出分组,并将区域 E - 区域 G 与区域 H - 区域 F 混合在一起。所以我想将这两个时间序列分开。
让我们将时间列除以 60
以创建一个系列,该系列标识属于不同 60 分钟间隔的行,然后 group
该系列的数据帧以及 AreaIn
AreaOut
和聚合列 Time
使用 first
和 output
使用 mean
以获得所需的结果
s = df['Time'] // 60
df_out = df.groupby([s, 'AreaIn', 'AreaOut'], sort=False)\
.agg({'Time': 'first', 'Output': 'mean'}).droplevel(0)
我有以下数据框:
Time AreaIn AreaOut Output
0 1 Area E Area G 200
1 16 Area E Area G 200
2 31 Area E Area G 200
3 46 Area E Area G 300
4 61 Area E Area G 459
5 ... ... ... ...
93 1396 Area E Area G 600
94 1411 Area E Area G 400
95 1426 Area E Area G 500
96 1441 Area E Area G 500
97 1 Area H Area F 600
98 16 Area H Area F 600
99 31 Area H Area F 600
100 46 Area H Area F 600
101 61 Area H Area F 116
102 ... ... ... ...
189 1381 Area H Area F 111
190 1396 Area H Area F 600
191 1411 Area H Area F 600
192 1426 Area H Area F 400
193 1441 Area H Area F 400
我想重塑它。 'Time' 列的范围为 1 到 1441,间隔为 15,但我希望它的范围为 1 到 1441,间隔为 60。而 'Output' 应该是每 4 行的平均值(每 4 行的总和除以 4)。
在这种情况下,数据帧仅包含两个时间序列,因此结果应如下所示:
Time AreaIn AreaOut Output
0 1 Area E Area G 450
1 61 Area E Area G 500
2 121 Area E Area G 600
3 181 Area E Area G 892
4 241 Area E Area G 459
5 ... ... ... ...
21 1261 Area E Area G 810
22 1321 Area E Area G 598
23 1381 Area E Area G 650
24 1441 Area E Area G 250
25 1 Area H Area F 600
26 61 Area H Area F 987
27 121 Area H Area F 0
28 181 Area H Area F 211
29 241 Area H Area F 116
30 ... ... ... ...
44 1201 Area H Area F 111
45 1261 Area H Area F 332
46 1321 Area H Area F 551
47 1381 Area H Area F 726
49 1441 Area H Area F 250
但是,我想实现一个可以处理两个以上时间序列的通用解决方案。
使用时:df = df.groupby(pd.cut(df["Time"], np.arange(1, 1442, 60))).mean()
我得到以下结果:
Time Output
Time
(1, 61] 38.5 2351
(61, 121] 98.5 2752
(121, 181] 158.5 4323
(181, 241] 218.5 2523
(241, 301] 278.5 3456
(301, 361] 338.5 1653
(361, 421] 398.5 4361
(421, 481] 458.5 6543
(481, 541] 518.5 3245
(541, 601] 578.5 2434
(601, 661] 638.5 1387
(661, 721] 698.5 4456
(721, 781] 758.5 2534
(781, 841] 818.5 3424
(841, 901] 878.5 2376
(901, 961] 938.5 2656
(961, 1021] 998.5 3456
(1021, 1081] 1058.5 1212
(1081, 1141] 1118.5 3355
(1141, 1201] 1178.5 2466
(1201, 1261] 1238.5 3462
(1261, 1321] 1298.5 2344
(1321, 1381] 1358.5 2453
(1381, 1441] 1418.5 3256
它将两个不同时间序列的输出分组,并将区域 E - 区域 G 与区域 H - 区域 F 混合在一起。所以我想将这两个时间序列分开。
让我们将时间列除以 60
以创建一个系列,该系列标识属于不同 60 分钟间隔的行,然后 group
该系列的数据帧以及 AreaIn
AreaOut
和聚合列 Time
使用 first
和 output
使用 mean
以获得所需的结果
s = df['Time'] // 60
df_out = df.groupby([s, 'AreaIn', 'AreaOut'], sort=False)\
.agg({'Time': 'first', 'Output': 'mean'}).droplevel(0)