Как выбрать строку с определённым индексом в DataFrame
Что проверяют
Различаете ли вы позицию строки и её метку в индексе. В pandas это разные вещи, и на их путанице держится половина тихих багов в подготовке данных. Следом обычно просят выбрать строки по условию или объяснить, почему df.loc[1] вернул не ту строку.
Как отвечать
Сначала разведите способы доступа:
df.loc[label]: выбор по метке индекса. Послеdf.set_index("user_id")запросdf.loc[42]ищет пользователя с идентификатором 42, а не строку под номером 42;df.iloc[pos]: выбор по порядковому номеру от нуля, как в списке Python. Отрицательные позиции работают,df.iloc[-1]это последняя строка;df.atиdf.iat: то же самое для одной ячейки, быстрее, когда нужно одно значение;- булева маска:
df.loc[df["age"] > 30]илиdf.query("age > 30"), когда строку ищут по значению, а не по индексу.
Дальше расскажите про тип результата. df.loc[42] возвращает Series, а df.loc[[42]] с двойными скобками возвращает DataFrame из одной строки. Если метка в индексе не уникальна, df.loc[42] отдаст DataFrame со всеми совпадениями, и код, рассчитывавший на Series, сломается ниже по конвейеру.
Назовите разницу в срезах: df.iloc[1:3] не включает правую границу, а df.loc["a":"c"] включает. Изменять строку нужно одним обращением, df.loc[42, "age"] = 31. Цепочка df.loc[42]["age"] = 31 пишет в промежуточный объект, и в pandas 3 с копированием при записи по умолчанию исходная таблица гарантированно не изменится.
Где спотыкаются
Путают loc и iloc на индексе по умолчанию. Пока индекс это RangeIndex от нуля, они совпадают, но после фильтрации или sort_values метки расходятся с позициями, и df.loc[0] падает с KeyError или возвращает чужую строку. Если метки не нужны, помогает reset_index(drop=True).
Пишут df[1], ожидая строку. Одинарные квадратные скобки у DataFrame выбирают колонку, поэтому получают KeyError или колонку с именем 1.
Ищут одну запись перебором через iterrows(). На таблице в миллион строк это секунды и минуты там, где маска или loc по индексу отрабатывают за миллисекунды.