reset_index в pandas — сброс индекса обратно в колонку

reset_index переносит индекс DataFrame или Series обратно в обычную колонку и ставит дефолтный целочисленный RangeIndex. Чаще всего вызывается после groupby/pivot, чтобы получить плоскую таблицу, и после фильтрации, чтобы перенумеровать строки. С drop=True старый индекс просто выбрасывается.

Синтаксис

DataFrame.reset_index(level=None, *, drop=False, inplace=False)

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

Пример 1: Вернуть ключи группировки в колонки

g = df.groupby('channel')['amount'].sum().reset_index()
g

Результат:

   channel  amount
0    email    80.0
1  organic  1620.0
2     paid   -30.0

Пример 2: drop=True — перенумеровать после фильтра

big = df[df['amount'] > 100].reset_index(drop=True)
big[['order_id', 'amount']]

Результат:

   order_id  amount
0      1001   120.0
1      1003  1500.0

Пример 3: Индекс Series становится колонкой

s = df.set_index('order_id')['amount']
s.reset_index().head(2)

Результат:

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

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

По умолчанию drop=False — старый индекс становится колонкой (с именем индекса или 'index'), что часто создаёт лишний столбец. После groupby().agg() reset_index превращает ключи группировки в обычные колонки. Для MultiIndex через level= можно сбросить только один уровень, оставив остальные в индексе.

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

Почти всегда идёт после groupby/pivot, чтобы вернуть плоскую таблицу, и после фильтрации, чтобы получить чистый 0,1,2… индекс. Частый вопрос на собеседовании — разница reset_index() и reset_index(drop=True).

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

reset_index() или reset_index(drop=True)?

Без drop старый индекс становится колонкой — это нужно после groupby, чтобы вернуть ключи в данные. С drop=True индекс просто выбрасывается и заменяется на 0,1,2… — удобно после фильтрации строк. Выбор зависит от того, нужны ли вам значения индекса дальше.

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

Передайте level= с именем или номером уровня: df.reset_index(level='channel'). Остальные уровни останутся в индексе. Можно передать и список уровней, чтобы сбросить несколько сразу.

Что делает inplace=True?

Меняет объект на месте и возвращает None вместо новой копии. В современном pandas inplace не даёт выигрыша по памяти и его не рекомендуют — лучше присваивать результат: df = df.reset_index().

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

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

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

Pandas: основы · Pandas groupby

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

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

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