midx = pd.MultiIndex(levels=[['zero', 'one'], ['x', 'y']],labels = [[1, 1, 0, 0],[1, 0, 1, 0]])
df = pd.DataFrame(np.random.randn(4, 2), index=midx)
>>midx
0 1
one y 0.477304 0.247328
x -1.267339 -1.779735
zero y 0.812613 1.119952
x 0.092788 0.384020
df.xs('one')[1]
Out[44]:
y 0.247328
x -1.779735
IIUC:
In [74]: df.loc['one', 1]
Out[74]:
y 0.247328
x -1.779735
Name: 1, dtype: float64
или более явно:
In [80]: df.loc[pd.IndexSlice['one', :], 1]
Out[80]:
one y 0.247328
x -1.779735
Name: 1, dtype: float64
В качестве альтернативы pd.IndexSlice
вы можете использовать pd.DataFrame.query
и выбрать свой столбец на отдельном шаге:
res = df.query('ilevel_0 == "one"').loc[:, 1]
Согласно документам, ilevel_0
используется для представления первого неназванного индекса. Для ясности вы можете заменить это на подлинное имя, если вы определили его как таковой, когда вы создаете dataframe.