2017-01-24 26 views
1

MultiIndexは、ラベルの値が整列していないときに、列の値を取得するために関数get_level_valuesを使用したときに、一見無作為に列を並べ替えます。例えばPandas MultiIndex並べ替える列

、私は私が正しい順序でそのラベル私はデータフレームの中に、このマルチインデックスを入れて、get_levels_values機能を実行すると、0〜4

import pandas as pd 
import numpy as np 
work_index=pd.MultiIndex(levels=[['ANA','ANC','PPI','SCAF','SAC'],['Sample']],labels=[[0,1,2,3,4],[0,0,0,0,0]]) 

に命じている私は['ANA','ANC','PPI','SCAF','SAC']を得るマルチインデックスを作成することができます得ることを期待する。私がいない番号順にラベルでmultindexを作成する場合

work=pd.DataFrame(np.random.randn(5,5),columns=work_index) 
work.columns #note the proper order 
>>> MultiIndex(levels=[['ANA', 'ANC', 'PPI', 'SCAF', 'SAC'], ['Sample']], 
      labels=[[0, 1, 2, 3, 4], [0, 0, 0, 0, 0]]) 
work.columns.get_level_values(0) #same order as before 
>>> Index(['ANA', 'ANC', 'PPI', 'SCAF', 'SAC'], dtype='object') 

しかし、get_level_valuesは奇妙な、一見ランダムな順序を返します。ここでは[0,1,2,3,4]の代わりに[2,1,4,3,0]を選択します。

not_work_index=pd.MultiIndex(levels=[['ANA','ANC','PPI','SCAF','SAC'],['Sample']],labels=[[2, 1, 4, 3, 0],[0,0,0,0,0]]) 

['PPI','ANC','SAC','SCAF','ANA']

not_work=pd.DataFrame(np.random.randn(5,5),columns=not_work_index) 
not_work.columns 
>>> MultiIndex(levels=[['ANA', 'ANC', 'PPI', 'SCAF', 'SAC'], ['Sample']], 
     labels=[[2, 1, 4, 3, 0], [0, 0, 0, 0, 0]]) 
not_work.columns.get_level_values(0) 
>>> Index(['PPI', 'ANC', 'SAC', 'SCAF', 'ANA'], dtype='object') 

ラベルが順番になっていない場合でも、順番にレベルを返すためget_level_valuesための方法はあり、むしろ、私に['ANA','ANC','PPI','SCAF','SAC']を与えるものではありませんデータフレームにこれを置きますか?列を正しい順序で取得するために上位レベルを照会するもう1つの方法はありますか?

+0

を私はあなたの例を実行していないが、一般的にはマルチインデックスは、彼らがどのように私は、その後multindexを並べ替えるでしょう – EdChum

+0

有用であるためにソートする必要がありますか?私が自分のCSVを読むと、これらの不均一なラベルが作成されます –

+0

これはバグかどうかわかりませんが、レベル値を取得すると常にソートされていますが、インデックスオブジェクトは作成した順序を知っているようです実際の挿入順序を取得するには、次のようにしなければなりません:In [11]: not_work.columns.get_level_values(not_work.columns.labels [0]] Out [11]: Index([ 'SAC'、 'ANC'、 'ANA'、 'SCAF'、 'PPI']、dtype = 'object') ' – EdChum

答えて

1

これはバグかどうかわかりませんが、get_level_valuesは常に作成順を無視してソートされた配列を返します。IndexArrayは正しい順序を知っています。私は

In [12]: 
not_work.columns.labels 

Out[12]: 
FrozenList([[2, 1, 4, 3, 0], [0, 0, 0, 0, 0]]) 

ここ
In [11]: 
not_work.columns.get_level_values(0)[not_work.columns.labels[0]] 

Out[11]: 
Index(['SAC', 'ANC', 'ANA', 'SCAF', 'PPI'], dtype='object') 

私はIndexArrayまたは列のlabels属性にアクセス:あなたはレベル値をマスクするlabel配列を取得するには、以下の危ないコードを使用する順序を得ることができますその後、インデックス最初のレベルを[0]を使用して:

In [13]: 
not_work.columns.labels[0] 

Out[13]: 
FrozenNDArray([2, 1, 4, 3, 0], dtype='int8') 

私たちは、その後、retuするレベル値をマスクするためにこれを使用することができます元の順序rnを:

In [11]: 
not_work.columns.get_level_values(0)[not_work.columns.labels[0]] 

Out[11]: 
Index(['SAC', 'ANC', 'ANA', 'SCAF', 'PPI'], dtype='object') 
+0

これはバグだと思いますが、 –

関連する問題