Короткий ответ
loc выбирает данные по меткам индекса и названиям столбцов, а iloc — по целочисленным позициям, независимо от того, какие метки реально стоят в индексе.
Как это работает подробнее
loc[a:b] включает обе границы диапазона, потому что это метки, а не позиции; iloc[a:b] ведёт себя как обычный Python-срез и не включает правую границу.
Пример кода
Пример Python
import pandas as pd
df = pd.DataFrame({'val': [10, 20, 30, 40]}, index=[5, 6, 7, 8])
print(df.iloc[1]) # вторая строка по позиции: индекс 6, val 20
print(df.loc[6]) # строка с меткой индекса 6: val 20Что использовать на практике
- На практике: loc удобен, когда индекс содержательный (ID, даты), а iloc — когда важна именно позиция строки, например "взять первые N строк" независимо от значений индекса; после фильтрации или сортировки полезно вызывать reset_index(), если дальше планируется позиционный доступ.
- Проверка: df.loc[1] на этом DataFrame вызовет KeyError, так как метки 1 в индексе нет — это наглядно показывает отличие от iloc[1].
Подводные камни
- Частые ошибки: обращаются к loc[1], думая, что это вторая строка по счёту, хотя после фильтрации метки индекса могут быть произвольными и такой метки может не быть вовсе; путают включительные границы loc и полуоткрытые границы iloc при срезах, получая на одну строку больше или меньше, чем ожидали.