2017-02-23 2 views
1

問題があり、意味をなさない。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 

と私はそれの上にスライスインデックスを実行したい:私は、私は簡単に(test1と呼ばれる)の例では、それを示すことができたように、私はサイズが小さく、大きなpd.DataFrameを持っています。しかし、それは動作していないようです。

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

あなたはsort_indexによってのみソートMultiIndex列のものが必要です

df = df.sort_index(axis=1) 

あなたはまたdocs - sorting a multiindexを確認することができます。

サンプル(列は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 
関連する問題