Мультииндекс в Pandas

Как организовать многоуровневую индексацию в Pandas, основы и применение

В сложных наборах данных иногда требуется создавать иерархические структуры, и здесь на помощь приходит мультииндекс. Pandas предоставляет мощные инструменты для создания и работы с мультиуровневой индексацией, что позволяет создавать более гибкие и информативные структуры данных.

Создание мультииндекса

Из списков

import pandas as pd

arrays = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
index = pd.MultiIndex.from_arrays(arrays, names=('letters', 'numbers'))

print(index)

# MultiIndex([('A', 1),
#             ('A', 2),
#             ('B', 1),
#             ('B', 2)],
#            names=['letters', 'numbers'])

Из кортежей

arrays = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=('letters', 'numbers'))

print(index)

# MultiIndex([('A', 1),
#             ('A', 2),
#             ('B', 1),
#             ('B', 2)],
#            names=['letters', 'numbers'])

Запросы к мультииндексу

Доступ к данным с мультииндексом может быть немного отличным:

Выбор данных по одному уровню:

df.loc['A']

Выбор данных по нескольким уровням:

df.loc[('A', 1)]

Сортировка мультииндекса

Для эффективной работы с мультииндексом рекомендуется его сортировать:

df.sort_index(inplace=True)

Управление уровнями мультииндекса

Переименование уровней:

df.index.rename(['new_name_1', 'new_name_2'], level=[0, 1], inplace=True)

Обмен уровней:

df.swaplevel(0, 1)

Восстановление уровней индекса в столбцы

Если вам нужно преобразовать один из уровней мультииндекса обратно в столбец:

df.reset_index(level='numbers')

Продвинутые запросы к мультииндексу

Используя метод xs, вы можете выполнять более сложные запросы:

df.xs(key=1, level='numbers')

Слияние и соединение с мультииндексами

При работе с мультииндексами можно также выполнять операции слияния и соединения:

df1 = pd.DataFrame({'A': [1, 2]}, index=pd.MultiIndex.from_tuples([('A', 1), ('B', 2)], names=['letters', 'numbers']))
df2 = pd.DataFrame({'B': [3, 4]}, index=pd.MultiIndex.from_tuples([('A', 1), ('B', 3)], names=['letters', 'numbers']))
merged = pd.merge(df1, df2, left_index=True, right_index=True, how='outer')

Агрегация на уровне мультииндекса

Можно выполнять агрегацию на определенных уровнях мультииндекса:

df.groupby(level='letters').sum()

Перекрестные таблицы с мультииндексами

Мультииндекс может быть полезен при создании перекрестных таблиц:

pd.crosstab(df['A'], [df.index.get_level_values('letters'), df.index.get_level_values('numbers')])

Преобразование уровней мультииндекса в столбцы и обратно

Вы можете преобразовать уровни мультииндекса в столбцы и обратно с помощью stack и unstack:

df.unstack(level='numbers')
df.stack()

Заключение

Мультииндексация в Pandas предоставляет инструменты для работы с иерархически организованными данными. Исходя из вашего опыта, возможно, потребуется время, чтобы освоиться с мультииндексацией, но стоит уделить этому внимание. Мультииндекс может значительно упростить и ускорить обработку сложных наборов данных.

Содержание: