Индекс DataFrame: как управлять и использовать
Основные методы работы с индексом 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().
Как выбрать строки по значению индекса с помощью loc?
Метод loc позволяет обращаться к строкам по меткам индекса.
df.index = ['x','y','z']
print(df.loc['y'])
A 2 B 5 Name: y, dtype: int64
Как выполнить сортировку строк по индексу?
Метод sort_index() сортирует строки по значениям индекса.
df = df.sort_index()
print(df)
Как переименовать индекс или его ось?
Для изменения имени индекса используется 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)
Как создать и использовать мультииндекс (MultiIndex)?
Мультииндекс позволяет иметь несколько уровней индекса. Создается с помощью set_index() со списком столбцов или напрямую через pd.MultiIndex.
df_multi = df.set_index(['A', 'B'])
print(df_multi.index)
print(df_multi.loc[(1,4)])
Как проверить, уникален ли индекс?
Свойство is_unique возвращает True, если все метки индекса уникальны.
print(df.index.is_unique)
Как преобразовать индекс в столбец?
Метод reset_index() превращает индекс в столбец, добавляя новый числовой индекс по умолчанию.
df_reset = df.reset_index()
print(df_reset)
Как выполнить операции над индексами (пересечение, объединение)?
Индексы поддерживают методы 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?
Методы 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)
Как сбросить индекс и одновременно установить новый?
Метод set_index() автоматически удаляет старый индекс. Если нужно сбросить текущий и установить другой столбец, достаточно вызвать set_index с нужным столбцом. Альтернатива: reset_index().set_index('column').
Расширенные примеры работы с индексом
Пример 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