Установка и сброс индекса
Превращайте столбец в индекс строк с помощью set_index(), возвращайте его обратно с помощью reset_index() и знакомьтесь с MultiIndex.
«Установка и сброс индекса» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Что такое индекс DataFrame?
Каждый DataFrame в Pandas имеет индекс строк — набор меток, связанных с каждой строкой. По умолчанию используется RangeIndex (0, 1, 2, …), но его можно заменить любым столбцом, выступающим естественным идентификатором: датой, идентификатором товара, идентификатором пользователя или любым уникальным ключом. Содержательный индекс повышает читаемость, позволяет выбирать данные по меткам и необходим для ресемплирования временных рядов.
import pandas as pd
df = pd.DataFrame({
'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
'sales': [100, 200, 150]
})
print('Default index:', df.index.tolist()) # [0, 1, 2]
print(df)set_index() — преобразование столбца в индекс
DataFrame.set_index('col') преобразует указанный столбец в индекс строк, удаляя его из обычных столбцов. Значения столбца становятся метками строк. Это стандартный способ сделать DataFrame более информативным, когда один из столбцов выступает естественным ключом. Возвращается новый DataFrame; исходный не изменяется, если не используется inplace=True.
import pandas as pd
df = pd.DataFrame({
'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
'sales': [100, 200, 150]
})
df = df.set_index('date')
print(df)
# sales
# date
# 2024-01-01 100
# 2024-01-02 200
# 2024-01-03 150
print(df.index) # Index(['2024-01-01', ...], dtype='object', name='date')Выбор строк с пользовательским индексом
После того как содержательный столбец становится индексом, Вы можете использовать .loc[label], чтобы получать строки по метке с помощью понятного синтаксиса — логические маски не требуются. Для DatetimeIndex можно даже использовать неполные строки с датой, например df.loc['2024-01'], чтобы выбрать все строки за январь 2024 года.
import pandas as pd
df = pd.DataFrame({
'product': ['A', 'B', 'C'],
'price': [10, 20, 30],
'stock': [100, 50, 75]
})
df = df.set_index('product')
# Access row by label
print(df.loc['B'])
# price 20
# stock 50
# Name: B, dtype: int64set_index() с несколькими столбцами — MultiIndex
Передача списка имён столбцов в set_index() создаёт MultiIndex (иерархический индекс). К получившемуся DataFrame можно обращаться с помощью кортежей в .loc[]. MultiIndex необходим для сгруппированных временных рядов (регион + дата), панельных данных (объект + время) и любого анализа, требующего двухуровневой группировки строк.
import pandas as pd
df = pd.DataFrame({
'region': ['East', 'East', 'West', 'West'],
'year': [2023, 2024, 2023, 2024],
'revenue': [100, 150, 200, 220]
})
df = df.set_index(['region', 'year'])
print(df)
# revenue
# region year
# East 2023 100
# 2024 150
# West 2023 200
# 2024 220
print(df.loc[('East', 2024)]) # revenue = 150Параметр drop= в set_index()
По умолчанию set_index('col') удаляет столбец из обычных столбцов DataFrame после преобразования его в индекс. Передайте drop=False, чтобы сохранить столбец на месте и одновременно использовать его как индекс. Это иногда полезно, когда нужен доступ по меткам, но сам столбец также требуется для вычислений среди обычных столбцов.
import pandas as pd
df = pd.DataFrame({'id': [1, 2, 3], 'value': [10, 20, 30]})
# Keep 'id' as both index and column
df_with_both = df.set_index('id', drop=False)
print(df_with_both)
# id value
# id
# 1 1 10
# 2 2 20
# 3 3 30reset_index() — возвращение индекса в столбец
reset_index() — обратная операция по отношению к set_index(): она перемещает текущий индекс строк обратно в обычный столбец и заменяет индекс стандартным RangeIndex. Это часто требуется после groupby().agg() или операций, в результате которых у Вас остаётся содержательный индекс, который нужно использовать как столбец при дальнейшей обработке.
import pandas as pd
df = pd.DataFrame({'sales': [100, 200]}, index=['East', 'West'])
df.index.name = 'region'
reset = df.reset_index()
print(reset)
# region sales
# 0 East 100
# 1 West 200
print(reset.index.tolist()) # [0, 1] — default RangeIndex restoredreset_index(drop=True)
Передача drop=True в reset_index() полностью удаляет текущий индекс, а не перемещает его в столбец. Используйте этот вариант, когда текущий индекс не содержит полезной информации (например, после фильтрации строк в нём остались пропуски вроде 0, 3, 7) и Вам нужен простой последовательный индекс, начинающийся с 0.
import pandas as pd
df = pd.DataFrame({'x': [10, 20, 30, 40, 50]})
filtered = df[df['x'] > 15]
print('Filtered index:', filtered.index.tolist()) # [1, 2, 3, 4]
# Drop the old index — don't move it to a column
clean = filtered.reset_index(drop=True)
print('Clean index:', clean.index.tolist()) # [0, 1, 2, 3]reset_index() после groupby
После вызова groupby().agg() ключи групп становятся индексом. Вызов reset_index() преобразует их обратно в обычные столбцы, создавая плоский табличный результат, с которым проще работать, объединять его с другими данными или экспортировать. Это один из самых распространённых случаев применения reset_index() на практике.
import pandas as pd
df = pd.DataFrame({
'dept': ['Eng', 'HR', 'Eng', 'Sales', 'HR'],
'salary': [90000, 50000, 80000, 70000, 55000]
})
# After groupby, dept becomes the index
agg = df.groupby('dept')['salary'].mean()
print(type(agg), agg.index.tolist())
# dept is the index
# Reset makes dept a regular column again
result = agg.reset_index()
result.columns = ['dept', 'avg_salary']
print(result)rename_axis() для имени индекса
Если у индекса строк нет имени или Вы хотите переименовать его для ясности, используйте df.rename_axis('new_name') (для индекса строк) или df.rename_axis('col_name', axis=1) (для оси столбцов). Содержательное имя индекса делает результат более понятным без дополнительных пояснений, особенно при экспорте в CSV, где имя индекса становится заголовком столбца.
import pandas as pd
df = pd.DataFrame({'sales': [100, 200, 300]}, index=['A', 'B', 'C'])
print(df.index.name) # None
# Name the index
df = df.rename_axis('region')
print(df)
# sales
# region
# A 100
# B 200
# C 300Переиндексация для заполнения пропусков
DataFrame.reindex(new_index) изменяет DataFrame так, чтобы он соответствовал новому индексу, заполняя значением NaN позиции, которые есть в новом индексе, но отсутствуют в исходных данных. Это используется для выравнивания DataFrames по общему полному индексу — например, чтобы в результате присутствовал каждый месяц года, даже если за некоторые месяцы нет данных.
import pandas as pd
df = pd.DataFrame({
'month': ['Jan', 'Mar', 'Jun'],
'revenue': [100, 200, 300]
}).set_index('month')
all_months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
complete = df.reindex(all_months)
print(complete)
# revenue
# Jan 100.0
# Feb NaN <- filled with NaN
# Mar 200.0
# Apr NaN
# May NaN
# Jun 300.0reset_index и выбор уровня MultiIndex
Для DataFrame с MultiIndex функция reset_index() по умолчанию перемещает все уровни обратно в столбцы. Передайте level=, чтобы сбросить только определённые уровни. Это полезно, когда один уровень нужно оставить индексом (например, сохранить дату в качестве индекса), а другой переместить в столбец.
import pandas as pd
df = pd.DataFrame(
{'revenue': [100, 150, 200, 220]},
index=pd.MultiIndex.from_tuples(
[('East', 2023), ('East', 2024), ('West', 2023), ('West', 2024)],
names=['region', 'year']
)
)
# Reset only the 'year' level, keep 'region' as index
df2 = df.reset_index(level='year')
print(df2)
# year revenue
# region
# East 2023 100
# East 2024 150
# West 2023 200
# West 2024 220Быстрая проверка
Проверьте, насколько хорошо Вы понимаете установку и сброс индекса.
Итоги урока
В этом уроке Вы узнали: set_index('col') преобразует столбец в индекс строк для доступа по меткам, передача списка создаёт MultiIndex, а reset_index() перемещает индекс обратно в столбец (используйте drop=True, чтобы вместо этого удалить его). Используйте reindex(), чтобы выровнять данные по полному целевому индексу, заполняя отсутствующие позиции значением NaN. Эти приёмы лежат в основе следующих уроков о GroupBy и объединении данных.
Часто задаваемые вопросы
Урок «Установка и сброс индекса» бесплатный?
Да — полный текст урока «Установка и сброс индекса» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.
Чему я научусь в уроке «Установка и сброс индекса»?
Превращайте столбец в индекс строк с помощью set_index(), возвращайте его обратно с помощью reset_index() и знакомьтесь с MultiIndex. Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?
Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Установка и сброс индекса»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?
Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Сортировка по значениям столбцов
- Сортировка по индексу
- Ранжирование значений
- Установка и сброс индекса