← Назад к вопросам
В чем разница между loc и iloc в Pandas?
1.0 Junior🔥 171 комментариев
#Pandas и обработка данных
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Различие между loc и iloc в Pandas
Краткое определение
- loc — label-based (по метке/индексу)
- iloc — integer location-based (по числовой позиции)
loc: по названию/метке
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35]
}, index=['id_1', 'id_2', 'id_3'])
# Выделение по метке индекса
row = df.loc['id_2'] # получаем Bob
# Выделение по названию колонки
age = df.loc['id_2', 'age'] # 30
# Срезы включают обе границы
subset = df.loc['id_1':'id_2'] # оба включены!
iloc: по позиции (как обычные списки)
# Выделение по номеру строки
row = df.iloc[1] # Bob (вторая строка, индекс 1)
# Выделение по позиции колонки
value = df.iloc[1, 1] # 30 (вторая строка, вторая колонка)
# Срезы исключают правую границу (как Python)
subset = df.iloc[0:2] # строки 0 и 1, но не 2
Основные различия
| Критерий | loc | iloc |
|---|---|---|
| Работает с | Метками, названиями | Числовыми индексами (0, 1, 2...) |
| Синтаксис срезов | Включает обе границы | Исключает правую (как Python) |
| Категориальные индексы | Отлично работает | Не подходит |
| Условия | Поддерживает условия | Не поддерживает |
| Производительность | Медленнее на больших данных | Быстрее |
Практические примеры
# Условное выделение (только loc!)
df.loc[df['age'] > 25] # получим Bob и Charlie
# Булев индекс
mask = df['age'] > 25
df.loc[mask] # работает
df.iloc[mask] # тоже работает, но интерпретирует как булев массив
# Присваивание значений
df.loc['id_2', 'age'] = 31 # изменим возраст Bob
df.iloc[1, 1] = 31 # то же самое
# Несколько строк
df.loc[['id_1', 'id_3']] # Alice и Charlie по меткам
df.iloc[[0, 2]] # то же самое по позициям
Когда использовать
loc предпочтителен когда:
- Работаешь с понятными метками/индексами (даты, коды товаров)
- Нужны условия:
df.loc[df['price'] > 100] - Индекс — часть данных (временной ряд, ID)
- Нужна селекция по колонкам:
df.loc[:, ['name', 'age']]
iloc предпочтителен когда:
- Нужна производительность на огромных данных
- Работаешь с позициями (первые 100 строк)
- Индекс — просто нумерация (не информативен)
- Нужны срезы как в обычном Python
Практический совет
# Если индекс информативный (даты, ID)
df = pd.read_csv('data.csv', index_col='date')
df.loc['2024-01-01'] # лучше читается
# Если индекс просто нумерация
df = pd.read_csv('data.csv', index_col=0) # (0,1,2...)
df.iloc[0:100] # проще и быстрее
Производительность
# iloc быстрее на 1-2 порядка для больших данных
import timeit
# На DataFrame с 1М строк:
# loc[900000]: ~1 ms
# iloc[900000]: ~0.1 ms
Вывод
loc = "give me the data with this label" iloc = "give me the data at this position"
Выбирай loc когда индекс имеет смысл, iloc когда нужна скорость или позиция.