Коротко
- Индекс — метки строк. По нему работают
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 / Falselevelв 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Метки нет в индексе
stock.set_index("sku").loc["Z-9"]Ошибка
KeyError: 'Z-9'
Проверка — "Z-9" in df.index.