📚 Pandas. Индексы и доступ к данным
Учимся ориентироваться в данных: выбирать строки и столбцы, понимать индексы и правильно к ним обращаться.
🔢 Индекс в Pandas
Индекс — это метки (label) строк, отдельная сущность, не входящая в состав колонок. Он служит для идентификации строк и быстрого доступа к ним.
Если индекс не задан явно, Pandas создаёт RangeIndex — стандартный числовой индекс от 0 до N-1 с шагом 1. Он работает по принципу range(), хранит только параметры start, stop, step и поэтому не занимает память. RangeIndex неизменяемый, но его можно переопределить, задав свой индекс.
import pandas as pd
df = pd.DataFrame({'город': ['Москва', 'Сочи']})
print(df.index) # RangeIndex(start=0, stop=2, step=1)Типы индексов могут быть:
- Числовые (0, 1, 2...)
- Строковые ('a', 'b', 'c')
- Временные (2023-01-01, 2023-01-02)
Индекс может быть неуникальным (содержать повторяющиеся метки)
Альтернативы RangeIndex:
- DatetimeIndex (для временных рядов)
- MultiIndex (иерархический)
- CategoricalIndex (для категориальных меток)
🎯 Польза индекса
1. Быстрый доступ по метке — df.loc['a'] вместо запоминания номера строки
2. Автоматическое выравнивание — при объединении данных Pandas сопоставляет строки по индексам
3. Срез по меткам — удобная выборка диапазонов (например, df.loc['2020':'2022'])
4. Смысловая нагрузка — индекс может быть id, датой и т.д.
📍 Доступ к данным: .loc и .iloc
В Pandas два основных метода выбора данных:
- `.loc[]` — выбор по меткам (именам) строк и столбцов
Включает правую границу среза (закрытый интервал). Это удобно, когда метки — не числа (например, даты или буквы): хочется получить все строки от 'a' до 'c' включительно.
- `.iloc[]` — выбор по позициям (целым числам)
Исключает правую границу (как в Python-срезах). Это естественно для позиционной индексации, где привычно, что [0:2] берёт элементы с индексами 0 и 1.
df = pd.DataFrame({'город': ['Москва', 'Казань', 'Сочи'],
'год': [2020, 2021, 2022]},
index=['a', 'b', 'c'])
print(df)
# город год
# a Москва 2020
# b Казань 2021
# c Сочи 2022Выбор по меткам — `.loc`
# Одна строка по метке
print(df.loc['b'])
# город Казань
# год 2021
# Несколько строк по меткам
print(df.loc[['a', 'c']])
# город год
# a Москва 2020
# c Сочи 2022
# Срез по меткам (включая правую границу!)
print(df.loc['a':'b'])
# город год
# a Москва 2020
# b Казань 2021Выбор по позициям — `.iloc`
# Первая строка (позиция 0)
print(df.iloc[0])
# город Москва
# год 2020
# Несколько строк по позициям
print(df.iloc[[0, 2]])
# город год
# a Москва 2020
# c Сочи 2022
# Срез по позициям (правая граница не включается)
print(df.iloc[0:2])
# город год
# a Москва 2020
# b Казань 2021
Выбор конкретных ячеек
Можно указать и строку, и столбец:
# .loc[метка_строки, метка_столбца]
print(df.loc['b', 'город']) # Казань
# .iloc[позиция_строки, позиция_столбца]
print(df.iloc[1, 0]) # Казань (строка 1, столбец 0)Все строки, конкретный столбец:
print(df.loc[:, 'город']) # все города
print(df.iloc[:, 0]) # первый столбец
Конкретные строки и столбцы:
print(df.loc[['a', 'c'], ['город']])
# город
# a Москва
# c Сочи🔄 Установка и сброс индекса
Сделать столбец индексом — `.set_index()`
df = pd.DataFrame({'id': [101, 102, 103],
'город': ['Москва', 'Казань', 'Сочи']})
print(df)
# id город
# 0 101 Москва
# 1 102 Казань
# 2 103 Сочиdf_indexed = df.set_index('id')
print(df_indexed)
# город
# id
# 101 Москва
# 102 Казань
# 103 СочиВернуть индекс обратно в столбец — `.reset_index()`
df_reset = df_indexed.reset_index()
print(df_reset)
# id город
# 0 101 Москва
# 1 102 Казань
# 2 103 СочиПараметр drop=True удаляет старый индекс без сохранения в столбец:
df_reset = df_indexed.reset_index(drop=True)
print(df_reset)
# город
# 0 Москва
# 1 Казань
# 2 Сочи
💬 Далее:
Pandas vs SQL