在 Pandas 中,如何在不进行排序的情况下取消堆叠?

8

我有一些时间序列数据,想要按照 Date 进行 unstack 操作。 但是当我使用 .unstack() 时,它会自动按照时间排序。(Date/Time 是多级索引)

      Date      Time      a  b     c        d  e
2015-12-06  22:00:00  21.26  0  2.62  242.195  0
2015-12-06  22:15:00  21.14  0  2.55  255.516  0
2015-12-06  22:30:00  21.20  0  2.49  241.261  0
2015-12-06  22:45:00  21.18  0  2.48  232.058  0
2015-12-06  23:00:00  21.12  0  2.38  239.661  0
2015-12-06  23:15:00  21.00  0  2.23  228.324  0
2015-12-06  23:30:00  21.13  0  2.29    0.000  0
2015-12-06  23:45:00  21.12  0  2.29    0.000  0
2015-12-06  00:00:00  21.02  0  2.17    0.000  0
2015-12-06  00:15:00  21.09  0  2.13    0.000  0
2015-12-06  00:30:00  20.96  0  2.21    0.000  0
2015-12-06  00:45:00  20.92  0  2.19    0.000  0
2015-12-06  01:00:00  20.99  0  2.13    0.000  0
2015-12-06  01:15:00  20.92  0  2.14    0.000  0
2015-12-06  01:30:00  20.97  0  2.13    0.000  0
2015-12-06  01:45:00  20.85  0  2.11    0.000  0
2015-12-06  02:00:00  20.76  0  1.72    0.000  0

我想要的结果如下。我该怎么做呢?

         a           a           a           a           ...
Date     2015-12-06  2015-12-13  2015-12-20  2015-12-23  ...
Time
22:00:00      21.02       21.26       20.75       22.61
22:15:00      21.09       21.36       20.74       22.65
...
00:00:00      20.92       21.20       20.79       22.37
00:15:00      20.99       21.33       20.77       22.44
00:30:00      20.92       21.24       20.76       22.28
...

1
你的输出与输入不匹配... - Stephen Rauch
2个回答

6

您需要先通过一级unstack,然后按照第二级的uniquereindex,最后对列中的MutiIndex的第二级sort_index

df = (df
    .unstack(0)
    .reindex(pd.unique(df.index.get_level_values(1)))
    .sort_index(axis=1, level=1)
    )
print(df)

                  a          b          c        c            e
Date     2015-12-06 2015-12-06 2015-12-06 2015-12-06 2015-12-06
Time                                                           
22:00:00      21.26          0       2.62    242.195          0
22:15:00      21.14          0       2.55    255.516          0
22:30:00      21.20          0       2.49    241.261          0
22:45:00      21.18          0       2.48    232.058          0
23:00:00      21.12          0       2.38    239.661          0
23:15:00      21.00          0       2.23    228.324          0
23:30:00      21.13          0       2.29      0.000          0
23:45:00      21.12          0       2.29      0.000          0
00:00:00      21.02          0       2.17      0.000          0
00:15:00      21.09          0       2.13      0.000          0
00:30:00      20.96          0       2.21      0.000          0
00:45:00      20.92          0       2.19      0.000          0
01:00:00      20.99          0       2.13      0.000          0
01:15:00      20.92          0       2.14      0.000          0
01:30:00      20.97          0       2.13      0.000          0
01:45:00      20.85          0       2.11      0.000          0
02:00:00      20.76          0       1.72      0.000          0

编辑:

idx = (pd.date_range('2015-01-01', '2015-01-01 23:45:00', freq='15T') + 
       pd.to_timedelta('22:00:00')
       ).time
df = df.unstack(0).reindex(idx)

我尝试了,但结果也是按时间排序的.. 你能再检查一下吗? - jerry han
[datetime.time(0, 0) datetime.time(0, 15) datetime.time(0, 30) datetime.time(0, 45) datetime.time(1, 0) datetime.time(1, 15) datetime.time(1, 30) datetime.time(1, 45) ... datetime.time(22, 0) datetime.time(22, 15) datetime.time(22, 30) datetime.time(22, 45) datetime.time(23, 0) datetime.time(23, 15) datetime.time(23, 30) datetime.time(23, 45)] - jerry han
我现在明白了,你的真实数据是不同的。给我一些时间。 - jezrael
是的,因为所有日常数据并不都在“22:00:00〜0:00:00〜07:00”这个时间段内...有些特定的日期是在“0:00:00〜07:00:00”,而其他日期则是在“22:00:00〜0:00:00〜07:00”中。 - jerry han
是的,有点问题,但请检查编辑后的答案。 - jezrael
显示剩余2条评论

2
从Pandas v2.1开始,你可以使用:
df.unstack("Date", sort=False)

现在它有sort=False
另请参阅pandas.DataFrame.unstack文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接