2017-08-23 2 views
0

Pandas MultiIndex:2番目のインデックスのみを認識している列を選択していますか?私は、次のデータフレームで働いている

age height weight shoe_size 
    RHS height weight shoe_size 
0 8.0 6.0 2.0  1.0 
1 8.0 NaN 2.0  1.0 
2 6.0 1.0 4.0  NaN 
3 5.0 1.0 NaN  0.0 
4 5.0 NaN 1.0  NaN 
5 3.0 0.0 1.0  0.0 

zipped = list(zip(df.columns, ["RHS", "height", "weight", "shoe_size"])) 

df.columns = pd.MultiIndex.from_tuples(zipped) 

だから、これは新しいデータフレームがある:私はこの方法でDFに別のヘッダを追加

age height weight shoe_size 
0 8.0  6.0  2.0  1.0 
1 8.0  NaN  2.0  1.0 
2 6.0  1.0  4.0  NaN 
3 5.0  1.0  NaN  0.0 
4 5.0  NaN  1.0  NaN 
5 3.0  0.0  1.0  0.0 

今私は対応するタプルを使用して、最初の列を選択する方法を知っています ("age", "RHS")

df[("age", "RHS")] 

しかし、私は2番目のインデックス "RHS"だけを使用してこれを行う方法については不思議でした。理想的には のようなもの:あなたはdf.sort_indexを使用して、最初に列を並べ替えて、.locの最初の引数としてslice(None)を渡す

df[(any, "RHS")] 

答えて

1

In [325]: df.sort_index(1).loc[:, (slice(None), 'RHS')] 
Out[325]: 
    age 
    RHS 
0 8.0 
1 8.0 
2 6.0 
3 5.0 
4 5.0 
5 3.0 

あなたはまた、df.locpd.IndexSliceを使用することができます。

In [332]: idx = pd.IndexSlice 

In [333]: df.sort_index(1).loc[:, idx[:, 'RHS']] 
Out[333]: 
    age 
    RHS 
0 8.0 
1 8.0 
2 6.0 
3 5.0 
4 5.0 
5 3.0 

スライサーでは、明示的にを渡す必要はありませんIndexSliceがそうです。あなたが列をソートしていない場合は


は、あなたが得る:

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

あなたが第2レベルで複数のRHSの列を持っている場合は、すべてそれらの列が返されます。

0

あなたは使用することができget_level_values

In [700]: df.loc[:, df.columns.get_level_values(1) == 'RHS'] 
Out[700]: 
    age 
    RHS 
0 8.0 
1 8.0 
2 6.0 
3 5.0 
4 5.0 
5 3.0 
関連する問題