> Как выбрать строку с определённым индексом в DataFrame (Python)
Уровень: middle · Роль: backend · Категория: Технические вопросы
Компании: Сбер
Стек: Python
> Пример ответа
Короткий ответ
В pandas для выбора строки по индексу используется метод .loc[] - он работает с метками индекса и включает правую границу. Если нужна позиционная выборка (по номеру строки), применяется .iloc[]. Для скалярного значения - .at[] и .iat[] соответственно. Выбор между .loc и .iloc зависит от того, что у вас в индексе: метки или порядковые номера.
Подробное объяснение
.loc[] принимает метку индекса (label-based). Если индекс целочисленный и не переопределён, метки совпадают с позициями, но это не гарантировано после сортировок или фильтраций. .iloc[] работает строго по позиции (position-based), начиная с нуля.
Разница критична: если индекс был переопределён, например, на строки или даты, .loc[5] вернёт строку с меткой 5, а .iloc[5] - шестую строку по порядку. Для одиночной строки .loc возвращает Series, для списка меток - DataFrame. .at[] быстрее для скалярного доступа, но не поддерживает срезы.
На практике
Если индекс стандартный RangeIndex, оба метода дадут одинаковый результат, но лучше всегда использовать .loc для явной работы с метками. При выборке по нескольким строкам передавайте список: df.loc[[2, 5]]. Для среза - df.loc[2:5] (включительно) против df.iloc[2:5] (исключая правую границу). Если индекс не уникален, .loc вернёт все строки с совпадающей меткой.
Пример кода
PYTHONimport pandas as pddf = pd.DataFrame({'value': [10, 20, 30, 40]}, index=['a', 'b', 'c', 'd'])# По метке индексаrow_b = df.loc['b'] # Series: value=20rows_ac = df.loc[['a', 'c']] # DataFrame с двумя строками# По позицииrow_2 = df.iloc[2] # Series: value=30 (третья строка)# Скалярное значениеval = df.at['d', 'value'] # 40val_pos = df.iat[0, 0] # 10# Срез по меткам (включая правую границу)slice_loc = df.loc['b':'c'] # строки b и c# Срез по позициям (исключая правую границу)slice_iloc = df.iloc[1:3] # строки b и c
Как отвечать на собеседовании
Начните с ключевого различия: .loc - по меткам, .iloc - по позициям. Приведите пример, где индекс переопределён, чтобы показать понимание. Упомяните нюансы: включение правой границы в .loc, возврат Series vs DataFrame, производительность .at/.iat. Если спросят про булеву маску - скажите, что она работает только с .loc, но это отдельная тема. Не углубляйтесь в реализацию, если не просят.
Что проверяет интервьюер
Проверяется понимание фундаментальной разницы между label-based и position-based доступом. Кандидат должен осознавать, что целочисленный индекс не означает позиционный доступ. Также оценивается знание edge cases: несуществующие метки, дубликаты индекса, срезы. Умение выбрать правильный метод под задачу - признак практического опыта, а не заученных примеров.
Типичные ошибки
- Использование
.ilocс метками после переопределения индекса - приводит к неверным данным или исключению. - Забывают, что
.locвключает правую границу среза, а.iloc- нет. - Применение
.locс целочисленным индексом, который не совпадает с позицией, и ожидание порядкового номера. - Попытка использовать
.atдля нескольких строк - метод работает только со скалярами. - Игнорирование возвращаемого типа: ожидают DataFrame, а получают Series, и наоборот.
> Похожие задачи по backend
Какова временная сложность добавления элемента в список Python в конец, начало и середину
Что такое range в Python и как он используется в качестве аргумента?
Какие есть ограничения на ключи в dict в Python?
Как посчитать возраст в годах между текущей датой и датой рождения в Python
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью