Настройка
idx = pd.MultiIndex.from_product([range(2), [*'XY']], names=['lvl0', 'lvl1'])
df = pd.DataFrame(1, idx, idx)
df
lvl0 0 1
lvl1 X Y X Y
lvl0 lvl1
0 X 1 1 1 1
Y 1 1 1 1
1 X 1 1 1 1
Y 1 1 1 1
Базовая анатомия мультииндекса
levels
Является frozenlist
из pandas.Index
объектов.Каждый из этих pandas.Index
объектов должен содержать уникальные значения.Если эти объекты индекса уровня не уникальны, возможно, что-то сломано.
[*map(type, df.index.levels)]
[pandas.core.indexes.numeric.Int64Index, pandas.core.indexes.base.Index]
вы можете получить по их dtype
[l.dtype for l in df.index.levels]
[dtype('int64'), dtype('O')]
labels
Это frozenlist
массивов.Существует один массив меток для каждого индекса уровня.Соответствующий массив меток содержит ссылку на отображаемые значения уровня.
[*map(type, df.index.labels)]
[pandas.core.indexes.frozen.FrozenNDArray,
pandas.core.indexes.frozen.FrozenNDArray]
print(*df.index.labels, sep='\n')
FrozenNDArray([0, 0, 1, 1], dtype='int8')
FrozenNDArray([0, 1, 0, 1], dtype='int8')
get_level_values
Доступ к значениям в индексе можно получить с помощьюget_level_values
df.index.get_level_values(1)
Index(['X', 'Y', 'X', 'Y'], dtype='object', name='lvl1')
Что было бы аналогично нарезке объекта level
с объектом label
df.index.levels[1][df.index.labels[1]]
Index(['X', 'Y', 'X', 'Y'], dtype='object', name='lvl1')