← Назад к вопросам

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

1.6 Junior🔥 221 комментариев
#Pandas и обработка данных

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между iloc и loc в pandas

Краткое определение

  • loc — Location-based (по метке, индексу, условию)
  • iloc — Integer Location-based (по целочисленной позиции, как в списке)

Основные отличия

Характеристикаlociloc
Тип доступаПо метке (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 — «я знаю позицию» → бери по номеру, как в списке