Индекс DataFrame: как управлять и использовать

Раздел: Анализ данных -> Библиотека Pandas

Основные методы работы с индексом DataFrame

Индекс в DataFrame - это уникальный идентификатор каждой строки. По умолчанию Pandas создает числовой индекс (RangeIndex), но его можно изменить на любой другой. Основные методы: .index, set_index(), reset_index(), reindex().

import pandas as pd
df = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6]})
print(df.index)

Python pandas index (работа с индексом dataframe в pandas)

RangeIndex(start=0, stop=3, step=1)

работа с библиотекой pandas python (работа с библиотекой pandas в python)

Для изменения индекса используется set_index():

df = df.set_index('A')
print(df)

Python pandas работа с данными (работа с данными в pandas)

   B
A   
1  4
2  5
3  6

Чтобы вернуть обратно, применяют reset_index().

Типичная ошибка - забыть указать inplace=True при изменении индекса через set_index. Метод возвращает новый DataFrame, а не модифицирует исходный.

Как выбрать строки по значению индекса с помощью loc?

Метод loc позволяет обращаться к строкам по меткам индекса.

df.index = ['x','y','z']
print(df.loc['y'])
A    2
B    5
Name: y, dtype: int64
Ошибка KeyError возникает, если метка отсутствует в индексе. Используйте isin() или reindex для обработки.

Как выполнить сортировку строк по индексу?

Метод sort_index() сортирует строки по значениям индекса.

df = df.sort_index()
print(df)
Если индекс содержит NaN, сортировка поместит их в конец или начало в зависимости от параметра na_position.

Как переименовать индекс или его ось?

Для изменения имени индекса используется rename_axis(). Для переименования отдельных меток - rename() с параметром index.

df.index.name = 'new_name'  # или df.rename_axis('new_name', inplace=True)
df.rename(index={1:'one', 2:'two'}, inplace=True)
Метод rename требует словарь или функцию, иначе возникает TypeError.

Как создать и использовать мультииндекс (MultiIndex)?

Мультииндекс позволяет иметь несколько уровней индекса. Создается с помощью set_index() со списком столбцов или напрямую через pd.MultiIndex.

df_multi = df.set_index(['A', 'B'])
print(df_multi.index)
print(df_multi.loc[(1,4)])
Обращение к мультииндексу требует передачи кортежа, иначе KeyError. Можно использовать .xs() для выбора по одному уровню.

Как проверить, уникален ли индекс?

Свойство is_unique возвращает True, если все метки индекса уникальны.

print(df.index.is_unique)
Неуникальный индекс может привести к непредсказуемым результатам при операциях, таких как loc или join.

Как преобразовать индекс в столбец?

Метод reset_index() превращает индекс в столбец, добавляя новый числовой индекс по умолчанию.

df_reset = df.reset_index()
print(df_reset)
Если нужно сохранить старый индекс как столбец, а новый индекс сделать из другого столбца, используйте последовательно reset_index и set_index.

Как выполнить операции над индексами (пересечение, объединение)?

Индексы поддерживают методы intersection(), union(), difference(), symmetric_difference().

idx1 = pd.Index([1,2,3])
idx2 = pd.Index([2,3,4])
print(idx1.intersection(idx2))
Int64Index([2, 3], dtype='int64')
Результат операций - новый индекс, а не исходный. При использовании с DataFrame может потребоваться reindex.

Как использовать индекс для объединения DataFrame?

Методы merge() и join() могут использовать индекс как ключ соединения. Для merge нужно указать left_index=True, right_index=True.

df1 = pd.DataFrame({'A': [1,2]}, index=['a','b'])
df2 = pd.DataFrame({'B': [3,4]}, index=['b','c'])
result = df1.join(df2)
print(result)
При join по умолчанию используется левое соединение. Если индексы не совпадают, возникают NaN.

Как сбросить индекс и одновременно установить новый?

Метод set_index() автоматически удаляет старый индекс. Если нужно сбросить текущий и установить другой столбец, достаточно вызвать set_index с нужным столбцом. Альтернатива: reset_index().set_index('column').

При reset_index старый индекс становится столбцом, что может быть нежелательно; используйте drop=True, чтобы удалить его.

Расширенные примеры работы с индексом

Пример 1: Работа с мультииндексом и срезом по уровням

Создадим DataFrame с двухуровневым индексом и выберем данные только по первому уровню.

Пример
arrays = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=index)
print(df)
print('--- Выбор по первому уровню ---')
print(df.loc['A'])
              value
first second       
A     1          10
      2          20
B     1          30
      2          40
--- Выбор по первому уровню ---
        value
second       
1          10
2          20

Метод xs() позволяет выбрать по одному уровню, не удаляя его:

Пример
print(df.xs(key='B', level='first'))
        value
second       
1          30
2          40

Пример 2: Использование reindex с интерполяцией и fill_value

Метод reindex() изменяет порядок строк в соответствии с новым индексом, добавляя пропуски для отсутствующих меток. Можно заполнить пропуски с помощью метода, например, ffill или fill_value.

Пример
df = pd.DataFrame({'A': [1, 2, 3]}, index=[0, 1, 3])
new_index = [0, 1, 2, 3, 4]
df_reindexed = df.reindex(new_index, fill_value=0)
print(df_reindexed)
# или с интерполяцией
df_interp = df.reindex(new_index).interpolate()
print(df_interp)
   A
0  1
1  2
2  0
3  3
4  0

          A
0  1.000000
1  2.000000
2  2.500000
3  3.000000
4  3.000000

Пример 3: Преобразование индекса в столбец с сохранением мультииндекса

Иногда требуется преобразовать мультииндекс в столбцы, сохранив иерархию. Используем reset_index() с параметром level.

Пример
arrays = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
index = pd.MultiIndex.from_arrays(arrays, names=['group', 'id'])
df = pd.DataFrame({'val': [10,20,30,40]}, index=index)
print(df)
# Сбрасываем только уровень group
print(df.reset_index(level='group'))
            val
group id      
A     1     10
      2     20
B     1     30
      2     40

  group  val
id          
1      A   10
2      A   20
1      B   30
2      B   40

Пример 4: Объединение DataFrame по индексу с помощью merge

Используем merge() с параметрами left_index и right_index для объединения по индексам. Покажем внутреннее и внешнее соединение.

Пример
df1 = pd.DataFrame({'A': [1,2,3]}, index=['x','y','z'])
df2 = pd.DataFrame({'B': [10,20]}, index=['y','z'])
# Внутреннее соединение (inner)
inner_merge = pd.merge(df1, df2, left_index=True, right_index=True, how='inner')
print('Inner merge:')
print(inner_merge)
# Внешнее соединение (outer)
outer_merge = pd.merge(df1, df2, left_index=True, right_index=True, how='outer')
print('\nOuter merge:')
print(outer_merge)
Inner merge:
   A   B
y  2  10
z  3  20

Outer merge:
     A     B
x  1.0   NaN
y  2.0  10.0
z  3.0  20.0

Работа с индексом DataFrame в Pandas - comments

En
Python pandas index (python)