具有如下所示的数据帧:
frame = pd.DataFrame(np.arange(12).reshape((4, 3)),
....: index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
....: columns=[['Ohio', 'Ohio', 'Colorado'],
....: ['Green', 'Red', 'Green']])
选择所有绿色列的最简单方法是什么?
frame['Green']
。不起作用。
xs
此方法就是为此目的而设计的。
frame.xs('Green', axis=1, level=1)
# frame.xs('Green', 1, 1)
Ohio Colorado
a 1 0 2
2 3 5
b 1 6 8
2 9 11
或保持水平
frame.xs('Green', axis=1, level=1, drop_level=False)
Ohio Colorado
Green Green
a 1 0 2
2 3 5
b 1 6 8
2 9 11
这大致相当于:
显然更复杂,但很有趣。
frame.loc[:, frame.columns.get_level_values(1) == 'Green']
或
frame.loc[:, frame.columns.labels[1] == frame.columns.levels[1].get_loc('Green')]
swaplevel
我不喜欢这种方式,但有利于提供信息的目的
frame.swaplevel(0, 1, 1).Green
Ohio Colorado
a 1 0 2
2 3 5
b 1 6 8
2 9 11
这是多索引,可以使用IndexSlice
frame.loc[:,pd.IndexSlice[:,'Green']]
Out[506]:
Ohio Colorado
Green Green
a 1 0 2
2 3 5
b 1 6 8
2 9 11