Нашли ошибку?
среднийpandas 3.0.6

set_index и reset_index

Сделать столбец индексом для доступа по ключу — и вернуть индекс обратно в столбцы.

Нужно знать:loc, iloc, at, iat

Содержание статьи

Коротко

  • Индекс — метки строк. По нему работают loc, выравнивание, join, временные ряды.
  • set_index("col") делает столбец индексом (по умолчанию убирая его из данных); список столбцов — MultiIndex.
  • reset_index() возвращает индекс в обычный столбец и ставит индекс 0, 1, 2…; drop=True — старый индекс просто выбросить.
  • После фильтрации и сортировки индекс остаётся старым, с пропусками — reset_index(drop=True) приводит его в порядок.
  • Индекс не обязан быть уникальным, но с повторами loc возвращает несколько строк.

Синтаксис

df.set_index(keys, drop=True)
df.reset_index(drop=False)
df.rename_axis("имя")          # имя индекса
df.index.is_unique

Параметры

ПараметрЧто делаетПо умолчанию
keysв set_index: столбец или список столбцовобязательный
dropв set_index — убрать столбец из данных; в reset_index — не превращать индекс в столбецTrue / False
levelв reset_index: какие уровни MultiIndex вернуть в столбцывсе

Примеры

Данные для примеровиспользуются во всех примерах ниже
stock = pd.DataFrame({
    "sku": ["A-1", "B-7", "C-3"],
    "item": ["латте", "чай", "раф"],
    "qty": [12, 40, 7],
})
Столбец — в индекс
by_sku = stock.set_index("sku")
print(by_sku)
by_sku.loc["B-7", "qty"]                 # теперь доступ по артикулу
Вывод
      item  qty
sku
A-1  латте   12
B-7    чай   40
C-3    раф    7
np.int64(40)
Индекс — обратно в столбец
stock.set_index("sku").reset_index()     # индекс снова обычный столбец
Вывод
   sku   item  qty
0  A-1  латте   12
1  B-7    чай   40
2  C-3    раф    7
Новый индекс после фильтра
filtered = stock[stock["qty"] > 10]
print(filtered)                          # индекс 0, 1 с пропуском
filtered.reset_index(drop=True)          # новый 0, 1, 2… без старого индекса
Вывод
   sku   item  qty
0  A-1  латте   12
1  B-7    чай   40
   sku   item  qty
0  A-1  латте   12
1  B-7    чай   40
Оставить столбец в данных
stock.set_index("sku", drop=False)       # столбец остаётся и в данных
Вывод
     sku   item  qty
sku
A-1  A-1  латте   12
B-7  B-7    чай   40
C-3  C-3    раф    7
Имя индекса
stock.set_index("sku").rename_axis("артикул")
Вывод
          item  qty
артикул
A-1      латте   12
B-7        чай   40
C-3        раф    7

Подводные камни

Повторяющиеся метки

loc по неуникальной метке возвращает таблицу, а не одну строку, — дальше код, рассчитанный на одно значение, ломается.

Метка встречается дважды
dup = pd.DataFrame({"qty": [12, 40, 5]}, index=["латте", "чай", "чай"])
print(dup.index.is_unique)
dup.loc["чай"]                           # повтор метки — несколько строк вместо одной
Вывод
False
     qty
чай   40
чай    5

Метки нет в индексе

loc с несуществующей меткойошибка: KeyError
stock.set_index("sku").loc["Z-9"]
Ошибка
KeyError: 'Z-9'

Проверка — "Z-9" in df.index.