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