Pandas MultiIndex:选择只知道第二个索引的列?

时间:2017-08-23 09:59:25

标签: python pandas dataframe multi-index

我正在使用以下DataFrame:

   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

我以这种方式向df添加了另一个标题:

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

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

所以这是新的DataFrame:

   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

现在我知道如何使用相应的元组("age", "RHS")来选择第一列:

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

但我想知道如何通过仅使用第二个索引" RHS"来完成此操作。 理想情况如下:

df[(any, "RHS")]

2 个答案:

答案 0 :(得分:1)

您将slice(None)作为第一个参数传递给.loc,前提是您先使用df.sort_index对列进行排序:

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

您还可以将pd.IndexSlicedf.loc

一起使用
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

使用切片器,您无需明确传递slice(None),因为IndexSlice会为您做到这一点。

如果您没有对列进行排序,则会得到:

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

如果您在第二级中有多个RHS列,则所有将返回这些列。

答案 1 :(得分:1)

您可以使用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