set_index в pandas — назначение колонки индексом

set_index делает одну или несколько колонок индексом DataFrame. Это ускоряет выборки по ключу через .loc, включает join по индексу и подготавливает временные ряды (DatetimeIndex). По умолчанию выбранная колонка удаляется из данных и живёт только в индексе.

Синтаксис

DataFrame.set_index(keys, *, drop=True, append=False, verify_integrity=False)

Примеры использования

Пример 1: Одна колонка как индекс + .loc

idx = df.set_index('order_id')
idx.loc[1003, 'amount']

Результат:

1500.0

Пример 2: MultiIndex по двум колонкам

mi = df.set_index(['user_id', 'order_id'])
mi.loc[7, ['channel', 'amount']]

Результат:

          channel  amount
order_id                 
1001      organic   120.0
1002         paid   -30.0

Пример 3: drop=False — оставить колонку в данных

df.set_index('order_id', drop=False)[['order_id', 'amount']].head(2)

Результат:

          order_id  amount
order_id                  
1001          1001   120.0
1002          1002   -30.0
Порешать Python-задачи в тренажёре →

Типичная ошибка

drop=True (по умолчанию) убирает колонку из данных — она остаётся только в индексе. append=False заменяет текущий индекс, и дефолтный RangeIndex теряется. Дубли в ключе разрешены, если не выставить verify_integrity=True (проверка медленнее, но ловит неуникальность).

Где спрашивают на собеседовании

Нужен для быстрых .loc-выборок по ключу, join по индексу и подготовки временных рядов (DatetimeIndex). На собеседовании проверяют связку set_index/reset_index и работу с MultiIndex.

FAQ: частые вопросы про set_index

Как вернуть колонку обратно после set_index?

Используйте reset_index() — индекс снова станет обычной колонкой. Либо заранее вызовите set_index('col', drop=False), чтобы значение осталось и в данных, и в индексе одновременно.

Можно ли иметь дубли в индексе?

Да, pandas это допускает. Но .loc по дублирующемуся ключу вернёт несколько строк, а некоторые операции (например reindex) сломаются. Проверить уникальность заранее можно через set_index(..., verify_integrity=True) — он упадёт с ошибкой при дублях.

Зачем ставить дату в индекс?

DatetimeIndex открывает срезы по времени (df.loc['2026-01']), ресемплинг resample(), rolling по времени и корректное выравнивание при join. Только сначала приведите колонку через pd.to_datetime, иначе индекс будет строковым.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы Python

Pandas: основы · Pandas: временные ряды

Другие функции pandas

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

Открыть Python-тренажёр (556 задач) →