loc и iloc — одна из базовых тем в pandas, но именно на ней многие новички начинают путаться. Вроде оба инструмента достают строки и столбцы, но делают это по разной логике.
Главная разница:
locработает по именам метокilocработает по позициям
loc — доступ по названиям
Пример:
import pandas as pd
df = pd.DataFrame({
"name": ["Анна", "Борис", "Вика"],
"score": [90, 75, 88]
}, index=["a", "b", "c"])
df.loc["a"]
Здесь "a" — это имя индекса, а не номер строки.
Можно выбрать строку и столбец:
df.loc["a", "score"]
iloc — доступ по позициям
Теперь по позиции:
df.iloc[0]
Это уже не имя индекса, а первая строка по порядку.
Выбрать конкретную ячейку:
df.iloc[0, 1]
То есть:
0— первая строка1— второй столбец
Самая простая запоминалка
loc-> label location -> по названиямiloc-> integer location -> по числам и позициям
Важная разница в срезах
Вот здесь многие ошибаются.
loc включает правую границу
df.loc["a":"b"]
Вернет строки "a" и "b".
iloc не включает правую границу
df.iloc[0:2]
Вернет строки с позициями 0 и 1, но не 2.
То есть iloc ведет себя как обычные срезы Python.
Когда использовать loc
loc удобен, когда ты работаешь:
- по названиям столбцов
- по именованному индексу
- по булевым условиям
Например:
df.loc[df["score"] > 80, ["name", "score"]]
Это очень частый и очень удобный паттерн.
Когда использовать iloc
iloc удобен, когда:
- тебе нужен доступ по номеру строки
- берешь “первые 5 строк”
- работаешь с конкретной позицией
Например:
df.iloc[:5, :2]
Это взять первые 5 строк и первые 2 столбца.
Частая ошибка №1: использовать loc как iloc
Например, индекс таблицы не 0,1,2, а 101,102,103.
Тогда:
df.loc[0]
может дать ошибку, потому что метки 0 в индексе нет.
Если тебе нужна первая строка по порядку, используй:
df.iloc[0]
Частая ошибка №2: забыть, что loc включает конец среза
Если ты привык к Python-срезам, то можешь ожидать одно поведение, а получить другое.
df.loc["a":"c"]
включит "c".
А
df.iloc[0:3]
вернет позиции 0,1,2.
Частая ошибка №3: путать доступ по индексу и по столбцу
Вот так:
df["score"]
это просто выбор столбца.
А вот так:
df.loc[:, "score"]
тоже выбор столбца, но уже через loc.
Оба варианта нормальны, но через loc бывает удобнее, когда сразу хочешь выбрать строки и столбцы.
Итог
Разница между loc и iloc в pandas очень простая:
loc— по именамiloc— по позициям
Если смотришь на метки индекса и названия столбцов — это loc.
Если смотришь на номера строк и столбцов — это iloc.
Эта тема кажется простой, но именно здесь часто рождаются ошибки в анализе данных, поэтому лучше сразу привыкнуть видеть разницу автоматически.