2014-09-11 7 views
1

Я изо всех сил пытаюсь переиндексировать мультииндекс. Пример кода ниже:Проблема с переиндексированием multiindex

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) 

дает (как и ожидалось):

184 184 
185 185 
186 186 
187 187 
... 
180 180 
181 181 
182 182 
183 183 
Length: 366, dtype: int64 

НО если я создаю MULTINDEX:

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 

Любые идеи по моей ошибке? - Благодаря.

Беван

ответ

1

Во-первых, вы должны указать 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 на определенном уровне (я открыл вопрос для обсуждения этого: https://github.com/pydata/pandas/issues/8241)


Раствора сейчас переиндексации вашей серии, чтобы создать мультииндексные и проиндексировать с этим (поэтому не на указанном уровне, а с полным индексом, который сохраняет порядок). Сделать это очень легко с MultiIndex.from_product, как у вас уже есть 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

Re уровня индекса у меня действительно как 0 (изменено 1, чтобы увидеть, если я мог бы получить что-нибудь работать ...). Спасибо, что очень хорошо отвечает на мой вопрос и дает мне больше понимания. – bevanj

Смежные вопросы