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.

Эта тема кажется простой, но именно здесь часто рождаются ошибки в анализе данных, поэтому лучше сразу привыкнуть видеть разницу автоматически.