pandas loc и iloc: разница меток, позиций и границ среза
В pandas loc выбирает строки по меткам индекса, а iloc — по числовым позициям. В loc-срезе обе метки границ включаются; в iloc-срезе правая позиция исключается.
Индекс не обязан совпадать с номером строки
Если индекс таблицы равен [10, 20, 30], метка 20 обозначает вторую строку. df.loc[20] обращается к этой метке, а df.iloc[1] — к позиции 1. Это совпадение результата, но разные способы адресации.
Для меточных срезов с отсутствующими границами и неупорядоченным индексом возможны дополнительные ограничения. Начните с уникального упорядоченного индекса, как в примере. Если границы неожиданно дают лишнюю строку, проверьте, используете ли вы метки или позиции.
Пример на других данных
import pandas as pd
s = pd.Series([5, 7, 9], index=[10, 20, 30])
print(s.loc[10:20].tolist())
print(s.iloc[0:1].tolist())
print(s.loc[20], s.iloc[1])
Результат:
[5, 7]
[5]
7 7
Попробуйте сами
Ниже — отдельное упражнение: напишите код и запустите проверку. Другие упражнения по этой теме. Для обучения по порядку откройте бесплатный курс NumPy и pandas.
loc-срез по меткам vs iloc-срез по позициям: одинаковые границы, разные результаты
Что уже дано
Проверяющая система запускает вашу программу и подаёт данные через stdin. Никаких заранее созданных переменных нет — вы читаете всё сами.
Что нужно сделать
Напишите программу, которая:
- Читает из
stdinцелое числоn— количество строк таблицы. - Читает следующие
nстрок; каждая содержит два токена через пробел:метка(строка без пробелов) изначение(целое число). Пример строки:alpha 100. - Строит
pd.DataFrameс одним столбцом'val'из прочитанных значений. В качестве индекса устанавливает список меток из входных данных (в порядке чтения). - Читает из
stdinстроку с двумя токенами через пробел:label_startиlabel_stop— метки дляloc-среза. - Читает из
stdinстроку с двумя целыми числами:pos_startиpos_stop— позиции дляiloc-среза. - Вычисляет
loc_result = df.loc[label_start:label_stop, ['val']]— срез по меткам (обе границы включаются). Выводит строку:loc_shape=<shape> loc_sum=<сумма столбца val>. - Вычисляет
iloc_result = df.iloc[pos_start:pos_stop, [0]]— срез по позициям (правая граница не включается). Выводит строку:iloc_shape=<shape> iloc_sum=<сумма столбца val>. - Выводит строку:
equal=<True/False>— совпадают ли суммы двух срезов.
Ввод и вывод
Программа читает stdin и пишет в stdout.
Формат ввода
n label1 val1 ... labelN valN label_start label_stop pos_start pos_stop
Дополнительные ограничения: n >= 1; все метки попарно различны; label_start и label_stop обязательно присутствуют среди меток входных строк.
Формат вывода
loc_shape=<shape> loc_sum=<int>
iloc_shape=<shape> iloc_sum=<int>
equal=<True/False>
Пример
- Ввод
5 alpha 100 beta 200 gamma 300 delta 400 epsilon 500 alpha gamma 0 3
- Вывод
loc_shape=(3, 1) loc_sum=600 iloc_shape=(3, 1) iloc_sum=600 equal=True
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Выборка столбцов и строк: [], loc и iloc без цепочной индексации — задача по NumPy и pandas
- pandas iloc с нестандартным индексом: метка или позиция
- pandas Series из словаря: index, shape и dtype
- pandas DataFrame из списка словарей: пример и задача
- Загрузка CSV с явными типами и датами через readcsv — задача по NumPy и pandas
- Загрузка CSV в pandas: dtype, usecols и разбор дат
