我正在使用以下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")]
答案 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.IndexSlice
与df.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