Ответ
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 или выберешь не то, и будешь потом сидеть и думать: "Э, бошка, думай, какого хуя?". Запомни раз и навсегда.