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

В чем разница между 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

Основные различия

Критерийlociloc
Работает сМетками, названиямиЧисловыми индексами (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 когда нужна скорость или позиция.