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