2017-11-30 6 views
2

DataFrameでマルチレベル列を選択しようとしています。整数位置によるマルチレベル列のインデックスまたはスライス

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], 
      ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] 
tuples = list(zip(*arrays)) 
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second']) 
df = pd.DataFrame(np.random.randn(6, 6), index=index[:6], columns=index[:6]) 

出力:たとえば

first    bar     baz     foo   
second    one  two  one  two  one  two 
first second                
bar one  1.031494 -1.115284 -0.154907 0.044911 2.443488 -0.534575 
     two -0.236643 1.547236 2.132647 0.366896 -0.710489 -0.478956 
baz one -0.365648 1.517573 0.668234 0.408448 -0.427475 -1.205160 
     two  1.362631 -0.785439 1.549837 -0.693337 0.610976 -1.989460 
foo one -0.449393 0.195214 1.120589 0.413219 -0.820709 0.349553 
     two -1.128392 -0.590630 0.559310 -0.225504 1.721240 1.326330 

私は今、選択レベルは、このような0 == 'bar' にすることができます

df.loc[:,slice("bar")] 

私に与える:

first    bar   
second    one  two 
first second      
bar one  1.031494 -1.115284 
     two -0.236643 1.547236 
baz one -0.365648 1.517573 
     two  1.362631 -0.785439 
foo one -0.449393 0.195214 
     two -1.128392 -0.590630 

これはdf.loc[:,slice(df.columns.levels[0][0])]でも動作し、同じ結果。

私の質問:上記の出力は得られますが、列 'bar'の整数位置を使用できますか?だから、代わりに:

df.loc[:,slice("bar")] 

私が使用したい:

df.loc[:,slice(0)] 

とつまり、まったく同じ出力を得る:私がしなければ、

first    bar   
second    one  two 
first second      
bar one  1.031494 -1.115284 
     two -0.236643 1.547236 
baz one -0.365648 1.517573 
     two  1.362631 -0.785439 
foo one -0.449393 0.195214 
     two -1.128392 -0.590630 

さらに:

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

取得したい:"レベル0 == 0(または"バー ")とレベル1 == 0(または" 1 ")の列を教えてください。

df.loc[:,(slice("bar"), slice("one"))] 

を使用してこの結果を達成できましたが、代わりに整数を使用したいと思います。

答えて

1

あなたはこれを不満足に思っていますが、自分がしたいことを直接行うことはできないと思います。

つまり、.iloc behaves differenlty than .loc for MultiIndexesです。その結果、整数を使用する場合は、今のように列自体を参照する必要があります。

ことはあなたのデータフレームと、この例を見てみましょう:

first   bar   baz   foo  
second   one two one two one two 
first second           
bar one -0.771 -0.211 -0.353 1.305 -0.595 1.174 
     two -1.777 -2.293 1.492 -2.638 0.197 0.406 
baz one -0.413 -0.932 1.491 0.245 0.624 -0.506 
     two -1.656 -1.053 -0.946 -0.403 -0.416 0.604 
foo one -0.586 0.030 0.517 0.899 -0.926 -0.777 
     two  1.477 -0.691 -1.330 1.022 -0.172 0.503 

ラベル選択によって、あなたは(hereからの例)を行うことができます:

df.loc[:, [('bar', 'one'),]] 
# try also df.loc[:, [('bar', 'two'), ('baz', 'one')]] 

first   bar 
second   one 
first second  
bar one -0.771 
     two -1.777 
baz one -0.413 
     two -1.656 
foo one -0.586 
     two  1.477 

を今、.ilocで置き換えるとまったく同じに保ちます構造:

df.iloc[:, [(0, 0),]] 
ValueError: Buffer has wrong number of dimensions (expected 1, got 2) 
ここ

差はパンダの開発者によって"deliberate design decision"と呼ばれていました:

.ilocは、全くのみ最初の実際の行動を構造 を考えていない、厳密な位置インデクサです。 ... .locを受け取ります アカウントレベルの動作。 [強調付加]

関連する問題