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. Никаких заранее созданных переменных нет — вы читаете всё сами.

Что нужно сделать

Напишите программу, которая:

  1. Читает из stdin целое число n — количество строк таблицы.
  2. Читает следующие n строк; каждая содержит два токена через пробел: метка (строка без пробелов) и значение (целое число). Пример строки: alpha 100.
  3. Строит pd.DataFrame с одним столбцом 'val' из прочитанных значений. В качестве индекса устанавливает список меток из входных данных (в порядке чтения).
  4. Читает из stdin строку с двумя токенами через пробел: label_start и label_stop — метки для loc-среза.
  5. Читает из stdin строку с двумя целыми числами: pos_start и pos_stop — позиции для iloc-среза.
  6. Вычисляет loc_result = df.loc[label_start:label_stop, ['val']] — срез по меткам (обе границы включаются). Выводит строку: loc_shape=<shape> loc_sum=<сумма столбца val>.
  7. Вычисляет iloc_result = df.iloc[pos_start:pos_stop, [0]] — срез по позициям (правая граница не включается). Выводит строку: iloc_shape=<shape> iloc_sum=<сумма столбца val>.
  8. Выводит строку: 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
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи