Столбцы мы выбирать умеем. Теперь строки. У каждой строки таблицы есть два «адреса»:
- позиция — порядковый номер строки, считая с нуля: первая строка — 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 — конец среза не входит:
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 |
Позиции за пределами таблицы нет — будет ошибка:
orders.iloc[5000]IndexError: single positional indexer is out-of-bounds
Сохраните в row_100 сотую по счёту строку таблицы orders, а в last_rows — четыре последние строки.
orders.iloc[-4:].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
row_100 = ...
last_rows = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
row_100 = orders.iloc[99]
last_rows = orders.iloc[-4:]Через запятую iloc принимает второй адрес — позицию столбца. Сначала строки, потом столбцы:
print(orders.iloc[0, 6])
print(orders.iloc[0, -1])Кофемолка ручная 2
orders.iloc[:3, 3:6]| city | channel | category | |
|---|---|---|---|
| 0 | Москва | маркетплейс | Аксессуары |
| 1 | Москва | маркетплейс | Чай |
| 2 | Москва | приложение | Сладости |
Двоеточие без чисел значит «все»: orders.iloc[:, 0] — первый столбец целиком.
Сохраните в corner блок таблицы orders: строки с позициями с 10 по 14 включительно и первые три столбца.
10:15.orders.iloc[10:15, :3].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
corner = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
corner = orders.iloc[10:15, :3]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 принимает метку строки:
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: у среза по меткам конец входит.
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 берёт
обе границы.
Достаньте из таблицы stats медиану цены — ячейку в строке "50%" и столбце price — и сохраните
в median_price. В quartiles сохраните значения столбца quantity в строках от "25%" до "75%".
stats.loc["50%", "price"].stats.loc["25%":"75%", "quantity"].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
median_price = ...
quartiles = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
median_price = stats.loc["50%", "price"]
quartiles = stats.loc["25%":"75%", "quantity"]Когда метки — числа
У таблицы orders метки строк — номера. loc всё равно понимает их как метки, и конец среза входит:
orders.loc[2:4, ["product", "price"]]| product | price | |
|---|---|---|
| 2 | Шоколад горький | 180 |
| 3 | Чёрный чай 100 г | 350 |
| 4 | Эфиопия 250 г | 790 |
Сколько строк в orders.loc[3:6]?
loc работает с метками и включает обе границы: метки 3, 4, 5, 6 — четыре строки. Три строки вернул бы orders.iloc[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:
print(last.iloc[0, 6])
print(last.loc[2445, "product"])Печенье овсяное Печенье овсяное
Метки 0 в этой таблице нет:
last.loc[0]KeyError: 0
Сохраните в piece строки таблицы orders с метками от 10 до 14 включительно и столбцы date, product,
price. Затем достаньте из piece по позиции товар в её первой строке и сохраните в first_product.
orders.loc[10:14, ["date", "product", "price"]] — у loc метка 14 входит.piece столбец product второй — его позиция 1: piece.iloc[0, 1].Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
piece = ...
first_product = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
piece = orders.loc[10:14, ["date", "product", "price"]]
first_product = piece.iloc[0, 1]Итоги
iloc[строки, столбцы]— по позициям с нуля; конец среза не входит, как у списков.loc[строки, столбцы]— по меткам индекса и названиям столбцов; конец среза входит.- Одна строка возвращается как Series, несколько — как таблица, строка и столбец — как одно значение.
- После отбора строк метки сохраняются, а позиции считаются заново.