← Назад к вопросам
В чём разница между iloc и loc?
1.6 Junior🔥 221 комментариев
#Pandas и обработка данных
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между iloc и loc в pandas
Краткое определение
- loc — Location-based (по метке, индексу, условию)
- iloc — Integer Location-based (по целочисленной позиции, как в списке)
Основные отличия
| Характеристика | loc | iloc |
|---|---|---|
| Тип доступа | По метке (label) | По позиции (position) |
| Синтаксис | .loc[label] | .iloc[position] |
| Включение границ | Включительно обе границы | Исключительно правая граница |
| Индекс | Работает с любым индексом (числа, строки, даты) | Работает только с целыми числами |
| Скорость | Немного медленнее | Немного быстрее |
Примеры
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [25, 30, 35, 40],
'salary': [50000, 60000, 75000, 80000]
}, index=['emp_001', 'emp_002', 'emp_003', 'emp_004'])
# Индекс: ['emp_001', 'emp_002', 'emp_003', 'emp_004']
# Позиции: [0, 1, 2, 3]
loc — доступ по метке
# Одна строка по метке
row = df.loc['emp_002']
print(row) # Bob, 30, 60000
# Диапазон (ВКЛЮЧАЕТ ОБЕ ГРАНИЦЫ!)
rows = df.loc['emp_001':'emp_003']
print(rows) # 3 строки: emp_001, emp_002, emp_003
# Один элемент
value = df.loc['emp_002', 'age']
print(value) # 30
# По условию
mask = df['age'] > 30
young = df.loc[mask]
print(young) # emp_003, emp_004
# Несколько столбцов
df.loc['emp_002', ['name', 'age']]
# name: Bob, age: 30
iloc — доступ по позиции
# Строка с позицией 1 (вторая строка)
row = df.iloc[1]
print(row) # Bob, 30, 60000
# Диапазон (ИСКЛЮЧАЕТ ПРАВУЮ ГРАНИЦУ!)
rows = df.iloc[0:3] # позиции 0, 1, 2 (не 3!)
print(rows) # 3 строки: emp_001, emp_002, emp_003
# Один элемент
value = df.iloc[1, 1] # строка 1, колонка 1
print(value) # 30
# Последние две строки
df.iloc[-2:]
print() # emp_003, emp_004
# Несколько строк и столбцов
df.iloc[1:3, [0, 2]] # строки 1-2, столбцы 0 и 2
# name, salary для Bob и Charlie
Критическое отличие: границы диапазонов
# LOC — ОБЕ ГРАНИЦЫ ВКЛЮЧЕНЫ
df.loc['emp_001':'emp_003'] # возвращает 3 строки
# ILOC — ПРАВАЯ ГРАНИЦА ИСКЛЮЧЕНА (как в Python срезах)
df.iloc[0:3] # возвращает строки 0, 1, 2 (не 3)
df.iloc[0:2] # возвращает строки 0, 1
Когда использовать
loc:
- Работа с понятными метками ('emp_001', 'Alice', '2024-01-15')
- Фильтрация по условиям (df.loc[df['age'] > 30])
- Явный доступ к строкам/столбцам по имени
# Типичный случай: фильтрация по условию
expensive = df.loc[df['salary'] > 60000]
print(expensive) # Charlie и David
iloc:
- Доступ по позиции (первые N строк, последние N строк)
- Когда нужно работать с индексом как со счётчиком
- Более быстрые операции на больших датасетах
# Типичный случай: взять первые и последние 5 строк
first_five = df.iloc[:5]
last_five = df.iloc[-5:]
Производительность
Для очень больших датасетов (миллионы строк) iloc немного быстрее, потому что не требует поиска по индексу. Но на практике разница незначительна.
Частые ошибки
Ошибка 1: забыть про разницу в границах
df.loc['emp_001':'emp_003'] # 3 строки ✓
df.iloc[0:3] # 3 строки ✓
df.iloc[0:2] # 2 строки ✗ (потому что ИСКЛЮЧАЕТ правую границу)
Ошибка 2: использовать целые числа с loc (когда индекс не целые числа)
df.loc[1, 'age'] # KeyError! Потому что индекс 'emp_002', не 1
df.iloc[1, 1] # 30 ✓ (правильно)
Заключение
loc — «я знаю метку» → фильтруй по имени/условию iloc — «я знаю позицию» → бери по номеру, как в списке