Нашли ошибку?
Скачать чистый
урок 2 из 5≈ 20 минупражнения: 0 из 4

Строки: loc и iloc

Два способа достать строку, ячейку или блок таблицы: iloc — по позиции, loc — по метке. Чем они отличаются, когда дают разный результат и почему у loc конец среза входит.

Python запустится при первом выполнении

Столбцы мы выбирать умеем. Теперь строки. У каждой строки таблицы есть два «адреса»:

  • позиция — порядковый номер строки, считая с нуля: первая строка — 0, вторая — 1;
  • метка (label) — подпись строки в индексе.

Пока индекс — номера 0, 1, 2…, позиция и метка совпадают, и разница незаметна. Но стоит отобрать или переставить строки — и они расходятся. Поэтому у pandas два инструмента: iloc работает с позициями, loc — с метками.

iloc: по позиции

iloc (integer location) пишут с квадратными скобками. Одно число — одна строка:

[ ]Первая строка таблицы
import pandas as pd

orders = pd.read_csv("data/shop_orders.csv")
orders.iloc[0]
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
order_id                  10001
date                 2025-01-01
customer_id                C095
city                     Москва
channel             маркетплейс
category             Аксессуары
product        Кофемолка ручная
price                      3200
quantity                      2
Name: 0, dtype: object

Строка вернулась как Series: метки — названия столбцов, значения — содержимое ячеек. Name: 0 — метка этой строки. Тип object значит, что в Series лежат значения разных типов: и числа, и текст.

Срезы и отрицательные номера работают как у списков Python — конец среза не входит:

[ ]Строки с позициями 2, 3, 4
orders.iloc[2:5]
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
order_id date customer_id city channel category product price quantity
2 10002 2025-01-01 C059 Москва приложение Сладости Шоколад горький 180 1
3 10002 2025-01-01 C059 Москва приложение Чай Чёрный чай 100 г 350 1
4 10003 2025-01-01 C203 Казань сайт Кофе Эфиопия 250 г 790 1

Список позиций возвращает строки в указанном порядке:

[ ]Первая, одиннадцатая и последняя
orders.iloc[[0, 10, -1]]
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
order_id date customer_id city channel category product price quantity
0 10001 2025-01-01 C095 Москва маркетплейс Аксессуары Кофемолка ручная 3200 2
10 10008 2025-01-03 C001 Екатеринбург приложение Сладости Миндаль в шоколаде 320 3
2447 11576 2025-12-31 C158 Казань приложение Сладости Зефир 210 2

Позиции за пределами таблицы нет — будет ошибка:

[ ]Строки 5000 нетошибка: IndexError
orders.iloc[5000]
Ошибкасохранённый · нажмите «Выполнить», чтобы получить свой
IndexError: single positional indexer is out-of-bounds
[ ]Упражнение 1Сотая строка и четыре последние решено

Сохраните в row_100 сотую по счёту строку таблицы orders, а в last_rows — четыре последние строки.

row_100 = ...
last_rows = ...

Через запятую iloc принимает второй адрес — позицию столбца. Сначала строки, потом столбцы:

[ ]Две ячейки строки 0: столбец 6 и последний
print(orders.iloc[0, 6])
print(orders.iloc[0, -1])
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
Кофемолка ручная
2
[ ]Блок: три строки, столбцы с 3 по 5
orders.iloc[:3, 3:6]
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
city channel category
0 Москва маркетплейс Аксессуары
1 Москва маркетплейс Чай
2 Москва приложение Сладости

Двоеточие без чисел значит «все»: orders.iloc[:, 0] — первый столбец целиком.

[ ]Упражнение 2Блок по позициям решено

Сохраните в corner блок таблицы orders: строки с позициями с 10 по 14 включительно и первые три столбца.

corner = ...

loc: по метке

Чтобы увидеть метки, которые не похожи на номера, возьмём сводку describe — у неё в индексе слова:

[ ]Сводка: метки строк — названия показателей
stats = orders.describe()
stats
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
order_id price quantity
count 2448.000000 2448.000000 2448.000000
mean 10787.296977 688.721405 2.128268
std 456.972637 537.676249 1.386154
min 10001.000000 150.000000 1.000000
25% 10390.000000 320.000000 1.000000
50% 10789.000000 540.000000 2.000000
75% 11182.000000 790.000000 3.000000
max 11576.000000 3200.000000 10.000000

loc принимает метку строки:

[ ]Строка с меткой mean
stats.loc["mean"]
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
order_id    10787.296977
price         688.721405
quantity        2.128268
Name: mean, dtype: float64

Через запятую — название столбца. Получается адрес ячейки «строка, столбец» — как в электронных таблицах:

[ ]Ячейки по метке строки и названию столбца
print(stats.loc["mean", "price"])
print(stats.loc["max", "quantity"])
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
688.7214052287582
10.0

У loc тоже есть срезы и списки. Главное отличие от iloc: у среза по меткам конец входит.

[ ]От min до 50% включительно
stats.loc["min":"50%", ["price", "quantity"]]
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
price quantity
min 150.0 1.0
25% 320.0 1.0
50% 540.0 2.0

Почему так? С позициями «до 5, не включая» удобно: [2:5] — три строки. С метками правило «не включая» потребовало бы знать, какая метка идёт после нужной, — а это неудобно и ненадёжно. Поэтому loc берёт обе границы.

[ ]Упражнение 3Читаем сводку решено

Достаньте из таблицы stats медиану цены — ячейку в строке "50%" и столбце price — и сохраните в median_price. В quartiles сохраните значения столбца quantity в строках от "25%" до "75%".

median_price = ...
quartiles = ...

Когда метки — числа

У таблицы orders метки строк — номера. loc всё равно понимает их как метки, и конец среза входит:

[ ]loc[2:4] — три строки, а не две
orders.loc[2:4, ["product", "price"]]
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
product price
2 Шоколад горький 180
3 Чёрный чай 100 г 350
4 Эфиопия 250 г 790
Вопрос

Сколько строк в orders.loc[3:6]?

Позиция и метка расходятся, как только в таблице остаются не все строки. Возьмём три последние:

[ ]Метки остались прежними
last = orders.tail(3)
last
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
order_id date customer_id city channel category product price quantity
2445 11575 2025-12-31 C057 Новосибирск маркетплейс Сладости Печенье овсяное 150 2
2446 11575 2025-12-31 C057 Новосибирск маркетплейс Аксессуары Фильтры бумажные 240 1
2447 11576 2025-12-31 C158 Казань приложение Сладости Зефир 210 2

Строки сохранили свои метки: 2445, 2446, 2447. А позиции в новой таблице — 0, 1, 2:

[ ]Первая строка: позиция 0, метка 2445
print(last.iloc[0, 6])
print(last.loc[2445, "product"])
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
Печенье овсяное
Печенье овсяное

Метки 0 в этой таблице нет:

[ ]loc ищет метку, а не позициюошибка: KeyError
last.loc[0]
Ошибкасохранённый · нажмите «Выполнить», чтобы получить свой
KeyError: 0
[ ]Упражнение 4Блок по меткам решено

Сохраните в piece строки таблицы orders с метками от 10 до 14 включительно и столбцы date, product, price. Затем достаньте из piece по позиции товар в её первой строке и сохраните в first_product.

piece = ...
first_product = ...

Итоги

  • iloc[строки, столбцы] — по позициям с нуля; конец среза не входит, как у списков.
  • loc[строки, столбцы] — по меткам индекса и названиям столбцов; конец среза входит.
  • Одна строка возвращается как Series, несколько — как таблица, строка и столбец — как одно значение.
  • После отбора строк метки сохраняются, а позиции считаются заново.

Подробнее в справочнике

Нашли ошибку?