В чем разница между loc и iloc в Pandas?

Ответ

loc и iloc — это два основных метода для доступа к данным в DataFrame и Series по строкам и столбцам. Их главное отличие — в типе индексации.

loc — выбор по метке (label-based):

  • Использует фактические значения индексов строк и названия столбцов.
  • Включает конечную границу в срезе.
  • Синтаксис: df.loc[строки, столбцы].

iloc — выбор по позиции (integer position-based):

  • Использует целочисленные позиции (как в обычных списках или массивах NumPy).
  • Исключает конечную границу в срезе (как стандартные срезы Python).
  • Синтаксис: df.iloc[строки, столбцы].

Наглядные примеры:

import pandas as pd
data = {'A': [10, 20, 30, 40], 'B': [50, 60, 70, 80]}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
print(df)
#    A   B
# a  10  50
# b  20  60
# c  30  70
# d  40  80

# loc — по меткам
print(df.loc['b', 'A'])          # 20 (одна ячейка)
print(df.loc['b':'c', 'A':'B'])  # Строки от 'b' до 'c' ВКЛЮЧИТЕЛЬНО и столбцы от 'A' до 'B' ВКЛЮЧИТЕЛЬНО
#    A   B
# b  20  60
# c  30  70

# iloc — по позициям
print(df.iloc[1, 0])             # 20 (строка с позицией 1, столбец с позицией 0)
print(df.iloc[1:3, 0:2])         # Строки с позиции 1 ДО 3 (ИСКЛЮЧАЯ 3) и столбцы 0:2 (ИСКЛЮЧАЯ 2)
#    A   B
# b  20  60
# c  30  70

Ключевое правило: loc работает с тем, что вы видите в индексе, iloc — с внутренними порядковыми номерами.

Ответ 18+ 🔞

Давай разберём эту тему, а то народ путается, как будто на дворе 2002-й год и все только начали учить Python. loc и iloc — это две основные палочки-выручалочки, чтобы тыкать пальцем в твой DataFrame и доставать оттуда что нужно. Разница между ними — хуй с горы, если честно, но её надо понимать, иначе будешь охуевать, почему код не работает.

loc — это выбор по ярлыкам (label-based):

  • Работает с теми именами, которые ты сам навешал на строки и столбцы. Видишь в таблице индекс 'a', 'b', 'c'? Вот с ними и работаешь.
  • Включает последний элемент в срезе. Сказал от 'b' до 'c' — получи и 'b', и 'c'. Честно, по-человечески.
  • Пишешь так: df.loc[строки, столбцы]. Всё просто, ёпта.

iloc — это выбор по позициям (integer position-based):

  • Работает с тупыми номерами, как в списке: 0, 1, 2... Ему похуй на твои красивые названия 'a' или 'sales'.
  • Исключает последний элемент в срезе, прямо как обычные питоновские срезы. Сказал от 1 до 3 — получишь позиции 1 и 2. Третью уже не даст, хитрая жопа.
  • Синтаксис такой же: df.iloc[строки, столбцы].

Смотри, как это выглядит на практике, чтобы волнение ебать ушло:

import pandas as pd
data = {'A': [10, 20, 30, 40], 'B': [50, 60, 70, 80]}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
print(df)
#    A   B
# a  10  50
# b  20  60
# c  30  70
# d  40  80

# loc — тыкаем в то, что видим глазами
print(df.loc['b', 'A'])          # 20 (ячейка на пересечении строки 'b' и столбца 'A')
print(df.loc['b':'c', 'A':'B'])  # Берём строки ОТ 'b' ДО 'c' (ВКЛЮЧАЯ 'c'!) и столбцы от 'A' до 'B'
#    A   B
# b  20  60
# c  30  70

# iloc — тыкаем по номерам, как варвары
print(df.iloc[1, 0])             # 20 (строка №1, столбец №0. Считай с нуля, не проеби!)
print(df.iloc[1:3, 0:2])         # Строки с №1 ДО №3 (НО БЕЗ №3!) и столбцы 0:2 (без второго)
#    A   B
# b  20  60
# c  30  70

Главное правило, которое выруби себе на лбу: loc — для работы с тем, что видно (метки), iloc — для работы с тем, что под капотом (позиции). Перепутаешь — получишь KeyError или выберешь не то, и будешь потом сидеть и думать: "Э, бошка, думай, какого хуя?". Запомни раз и навсегда.