> Как выбрать строку с определённым индексом в 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 вернёт все строки с совпадающей меткой.

Пример кода

PYTHON
import pandas as pd
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=['a', 'b', 'c', 'd'])
# По метке индекса
row_b = df.loc['b'] # Series: value=20
rows_ac = df.loc[['a', 'c']] # DataFrame с двумя строками
# По позиции
row_2 = df.iloc[2] # Series: value=30 (третья строка)
# Скалярное значение
val = df.at['d', 'value'] # 40
val_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, и наоборот.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью