2017-02-23 60 views
1

У меня проблема, и это просто не имеет смысла. У меня есть большой pd.DataFrame, что я уменьшил в размерах, так что я мог бы легко показать на примере (так называемый test1):Нарезка MultiIndex не работает должным образом (ошибка с использованием lexsorted кортежей)

>>> print(test1) 

value   TIME              \ 
star    0   1   2   3   4 
0  1952.205873 1952.205873 1952.205873 1952.205873 1952.205873 
1  1952.226307 1952.226307 1952.226307 1952.226307 1952.226307 
2  1952.246740 1952.246740 1952.246740 1952.246740 1952.246740 
3  1952.267174 1952.267174 1952.267174 1952.267174 1952.267174 

value      CNTS        \ 
star    5    0    1    2 
0  1952.205873 575311.432228 534103.079080 179471.239561 
1  1952.226307 571480.854183 533138.021051 187456.451900 
2  1952.246740 555631.798095 530263.846685 203247.734806 
3  1952.267174 553639.056784 527058.335157 210088.229427 

value            
star    3    4   5 
0  121884.201457 39003.397835 2089.321993 
1  122796.312201 39552.401359 2810.010142 
2  123500.068304 39158.050385 2652.409086 
3  124357.387418 38881.565235 2721.908129 

и я хочу, чтобы выполнить срез индексации на нем. Однако он просто не работает. Вот что я пытаюсь:

test.loc[:,(slice(None),0)] 

и я получаю эту ошибку:

*** KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (2), lexsort depth (0)' 

Это не первый раз, когда я имел эту ошибку или задал вопрос, но я до сих пор не понять, как это исправить, и что не так.

Еще более запутанным является то, что следующий код, кажется, работает без сучка и задоринки:

import pandas as pd 
import numpy as np 


column_values = ['TIME', 'XPOS'] 
target = range(0,2) 
mindex = pd.MultiIndex.from_product([column_values, target], names=['value', 'target']) 
df = pd.DataFrame(columns=mindex, index=range(10), dtype=float) 

print(df.loc[:,(slice(None),0)]) 

Я просто не понимаю, что происходит, и что здесь не так.

ответ

1

Вам только нужно сортировать MultiIndex в столбцах по sort_index:

df = df.sort_index(axis=1) 

Вы также можете проверить docs - sorting a multiindex.

Sample (столбцы не lexsorted):

#your sample, only swap values in column_values 
column_values = ['XPOS', 'TIME'] 
target = range(0,2) 
mindex = pd.MultiIndex.from_product([column_values, target], names=['value', 'target']) 
df = pd.DataFrame(columns=mindex, index=range(10), dtype=float) 
print (df) 
value XPOS  TIME  
target 0 1 0 1 
0  NaN NaN NaN NaN 
1  NaN NaN NaN NaN 
2  NaN NaN NaN NaN 
3  NaN NaN NaN NaN 
4  NaN NaN NaN NaN 
5  NaN NaN NaN NaN 
6  NaN NaN NaN NaN 
7  NaN NaN NaN NaN 
8  NaN NaN NaN NaN 
9  NaN NaN NaN NaN 

print (df.columns.is_lexsorted()) 
False 

df = df.sort_index(axis=1) 
print (df.columns.is_lexsorted()) 
True 

print(df.loc[:,(slice(None),0)]) 
value TIME XPOS 
target 0 0 
0  NaN NaN 
1  NaN NaN 
2  NaN NaN 
3  NaN NaN 
4  NaN NaN 
5  NaN NaN 
6  NaN NaN 
7  NaN NaN 
8  NaN NaN 
9  NaN NaN 
Смежные вопросы