Python 重新编制多索引索引的问题

Python 重新编制多索引索引的问题,python,pandas,Python,Pandas,我正在努力为多重索引重新编制索引。示例代码如下: rng = pd.date_range('01/01/2000 00:00', '31/12/2004 23:00', freq='H') ts = pd.Series([h.dayofyear for h in rng], index=rng) daygrouped = ts.groupby(lambda x: x.dayofyear) daymean = daygrouped.mean() myindex = np.arange(1,367)

我正在努力为多重索引重新编制索引。示例代码如下:

rng = pd.date_range('01/01/2000 00:00', '31/12/2004 23:00', freq='H')
ts = pd.Series([h.dayofyear for h in rng], index=rng)
daygrouped = ts.groupby(lambda x: x.dayofyear)
daymean = daygrouped.mean()
myindex = np.arange(1,367)
myindex = np.concatenate((myindex[183:],myindex[:183]))
daymean.reindex(myindex)
给出(如预期的):

但如果我创建一个多重索引:

hourgrouped = ts.groupby([lambda x: x.dayofyear, lambda x: x.hour])
hourmean = hourgrouped.mean()
myindex = np.arange(1,367)
myindex = np.concatenate((myindex[183:],myindex[:183]))
hourmean.reindex(myindex, level=1)
我得到:

1  1     1
   2     1
   3     1
   4     1
...
366  20    366
     21    366
     22    366
     23    366
Length: 8418, dtype: int64
对我的错误有什么看法吗谢谢


Bevan

首先,您必须指定
level=0
而不是
1
(因为它是第一级->基于零的索引->0)。
但是,仍然存在一个问题:重新编制索引是可行的,但在多索引的情况下,似乎无法保持所提供索引的顺序:

In [54]: hourmean.reindex([5,4], level=0)
Out[54]:
4  0     4
   1     4
   2     4
   3     4
   4     4
   ...
   20    4
   21    4
   22    4
   23    4
5  0     5
   1     5
   2     5
   3     5
   4     5
   ...
   20    5
   21    5
   22    5
   23    5
dtype: int64
因此,获取索引的新子集是可行的,但其顺序与原始索引相同,而不是与新提供的索引相同。
这可能是某个级别上的
reindex
的一个bug(我打开了一个问题来讨论这个:)


现在,重新编制序列索引的一个解决方案是创建一个多索引,并使用该索引重新编制索引(因此不是在指定的级别上,而是使用完整索引,这样可以保留顺序)。使用
multi-index执行此操作非常简单。从您已有的
myindex
产品中:

In [79]: myindex2 = pd.MultiIndex.from_product([myindex, range(24)])

In [82]: hourmean.reindex(myindex2)
Out[82]:
184  0     184
     1     184
     2     184
     3     184
     4     184
     5     184
     6     184
     7     184
     8     184
     9     184
     10    184
     11    184
     12    184
     13    184
     14    184
...
183  9     183
     10    183
     11    183
     12    183
     13    183
     14    183
     15    183
     16    183
     17    183
     18    183
     19    183
     20    183
     21    183
     22    183
     23    183
Length: 8784, dtype: int64

关于索引级别,我确实将其设置为0(将其更改为1,以查看是否可以获得任何工作…)。谢谢你很好地回答了我的问题,让我更加理解。
In [79]: myindex2 = pd.MultiIndex.from_product([myindex, range(24)])

In [82]: hourmean.reindex(myindex2)
Out[82]:
184  0     184
     1     184
     2     184
     3     184
     4     184
     5     184
     6     184
     7     184
     8     184
     9     184
     10    184
     11    184
     12    184
     13    184
     14    184
...
183  9     183
     10    183
     11    183
     12    183
     13    183
     14    183
     15    183
     16    183
     17    183
     18    183
     19    183
     20    183
     21    183
     22    183
     23    183
Length: 8784, dtype: int64