0Pricing
Pandas & NumPy Academy · Урок

Доступ по меткам и позициям

Получайте элементы с помощью .loc (метка) и .iloc (целочисленная позиция) и разберитесь в различии между ними

«Доступ по меткам и позициям» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Два способа доступа к элементам Series

Pandas предоставляет два основных средства доступа к элементам Series: .loc для доступа по метке и .iloc для доступа по целочисленной позиции. Критически важно понимать, какое из них и когда использовать: применение неправильного средства к Series с целочисленным индексом приводит к непонятным результатам, а в Pandas 2.0 многие неоднозначные варианты прямого обращения через квадратные скобки объявлены устаревшими.

import pandas as pd

s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s.loc['b'])    # 20  -- by label
print(s.iloc[1])     # 20  -- by position

.loc: доступ по метке

.loc обращается к элементам по их метке индекса. Можно передать одну метку (возвращается скаляр), список меток (возвращается Series) или диапазон меток (обе границы включаются, в отличие от срезов Python). Если метка не существует, Pandas вызывает ошибку KeyError. Используйте .loc, когда метки имеют смысл (даты, имена, идентификаторы).

import pandas as pd

s = pd.Series([10, 20, 30, 40, 50],
              index=['a', 'b', 'c', 'd', 'e'])

print(s.loc['c'])          # 30
print(s.loc[['a', 'c']])   # a:10 c:30
print(s.loc['b':'d'])      # b:20 c:30 d:40 -- inclusive

.iloc: доступ по позиции

.iloc обращается к элементам по их целочисленной позиции (нумерация начинается с 0), полностью игнорируя метки индекса. Это работает как индексация списка Python: отрицательные позиции отсчитываются с конца, а срезы используют соглашение Python с исключением конечной границы. Используйте .iloc, когда нужен «элемент с номером n» независимо от его метки.

import pandas as pd

s = pd.Series([10, 20, 30, 40, 50],
              index=['a', 'b', 'c', 'd', 'e'])

print(s.iloc[2])          # 30  -- third element
print(s.iloc[-1])         # 50  -- last element
print(s.iloc[1:4])        # b:20 c:30 d:40 -- exclusive stop

Различия между .loc и .iloc

Разница особенно важна для Series с целочисленными метками. Если Series имеет метки индекса [5, 10, 15], то s.loc[5] возвращает элемент с меткой 5 (первый элемент), тогда как s.iloc[5] вызывает ошибку IndexError (в Series всего 3 элемента). Всегда выбирайте средство доступа в зависимости от того, что Вам нужно: «элемент с меткой X» или «элемент под номером X».

import pandas as pd

s = pd.Series([100, 200, 300], index=[5, 10, 15])
print(s.loc[10])   # 200  -- element with label 10
print(s.iloc[1])   # 200  -- second element
# s.loc[1] would raise KeyError -- no label 1

Выбор нескольких меток с помощью .loc

Передайте список в .loc, чтобы выбрать несколько элементов в любом порядке, в том числе с повторами. Результатом будет новый Series с теми же метками, что и в переданном списке. Это похоже на расширенную индексацию в NumPy, но выбор выполняется по меткам индекса, а не по позициям. Такой подход часто используется для изменения порядка или выбора подмножества столбцов в аналитических конвейерах.

import pandas as pd

s = pd.Series({'Jan': 100, 'Feb': 200, 'Mar': 300, 'Apr': 400})

# Select Q1 months in reverse order
print(s.loc[['Mar', 'Feb', 'Jan']])
# Mar    300
# Feb    200
# Jan    100

Выбор диапазона меток с помощью .loc

В отличие от срезов Python, срезы .loc включают обе границы. s.loc['b':'d'] возвращает элементы с метками b, c и d. Это может удивить, если Вы привыкли к соглашению Python с исключением конечной границы. Убедитесь, что метки, между которыми выполняется срез, действительно существуют в индексе, иначе результат может неожиданно вернуться без ошибки.

import pandas as pd

s = pd.Series(range(5), index=['a', 'b', 'c', 'd', 'e'])
print(s.loc['b':'d'])
# b    1
# c    2
# d    3
# dtype: int64
# Note: 'd' is INCLUDED (inclusive stop)

Булева индексация с помощью .loc

Для фильтрации элементов можно передать логический Series в .loc. Логический Series должен иметь тот же индекс, что и целевой Series. Это аналог логической маски NumPy в Pandas, поддерживающий составные условия с помощью & и |. Это также стандартный способ фильтрации строк в DataFrames.

import pandas as pd

s = pd.Series([3, 7, 2, 9, 1], index=['a', 'b', 'c', 'd', 'e'])
print(s.loc[s > 4])
# b    7
# d    9
# dtype: int64

Присваивание значений с помощью .loc и .iloc

И .loc, и .iloc можно использовать в левой части присваивания, чтобы изменять значения непосредственно. Это правильный подход: использование цепочки индексации, например s['a'] = 99, может вызвать SettingWithCopyWarning в DataFrames. Для Series прямой доступ по метке обычно безопасен, но .loc более явно показывает намерение и рекомендуется к использованию.

import pandas as pd

s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
s.loc['b'] = 99
print(s)
# a    10
# b    99
# c    30

Доступ к Series с помощью квадратных скобок

Прямая запись с квадратными скобками s['label'] работает для доступа по метке и эквивалентна s.loc['label'] при строковых индексах. Для целочисленных индексов поведение неоднозначно и было изменено в Pandas 2.0: теперь такая запись всегда означает доступ по метке. Для ясности и совместимости с будущими версиями всегда явно используйте .loc или .iloc, а не полагайтесь на определение смысла квадратных скобок.

import pandas as pd

s = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
print(s['y'])      # 20  -- label access via brackets
print(s.loc['y']) # 20  -- explicit and preferred

Доступ к элементам DatetimeIndex

Если Series имеет индекс DatetimeIndex, .loc принимает неполные строки с датами для удобного выбора диапазона. s.loc['2023'] возвращает все элементы за 2023 год, а s.loc['2023-01':'2023-06'] — элементы за первую половину 2023 года. Это одна из самых удобных возможностей Pandas для работы с временными рядами.

import pandas as pd

dates = pd.date_range('2023-01-01', periods=5, freq='ME')
values = pd.Series([10, 20, 30, 40, 50], index=dates)
print(values.loc['2023-03':'2023-05'])
# 2023-03-31    30
# 2023-04-30    40
# 2023-05-31    50

at и iat для быстрого доступа к одному элементу

.at[label] и .iat[position] — оптимизированные средства доступа к отдельным значениям. Внутри тесного цикла они работают быстрее, чем .loc и .iloc, поскольку не создают объект Series. Они не могут выбирать несколько элементов. Используйте их, когда для многократного доступа к отдельным элементам нужна максимальная производительность.

import pandas as pd

s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s.at['b'])    # 20  -- label scalar access
print(s.iat[2])     # 30  -- position scalar access

Быстрая проверка

Проверьте, насколько хорошо Вы поняли материал этого урока о .loc и .iloc.

Итоги урока

В этом уроке Вы узнали, что .loc обращается к элементам по метке индекса, а конечные позиции среза включаются, .iloc обращается к элементам по целочисленной позиции, а конечные позиции среза не включаются, как в списках Python, а .at и .iat — более быстрые средства доступа к отдельным значениям в циклах. Далее мы рассмотрим векторизованные операции над Series и автоматическое выравнивание индексов в Pandas.

Часто задаваемые вопросы

Урок «Доступ по меткам и позициям» бесплатный?

Да — полный текст урока «Доступ по меткам и позициям» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Чему я научусь в уроке «Доступ по меткам и позициям»?

Получайте элементы с помощью .loc (метка) и .iloc (целочисленная позиция) и разберитесь в различии между ними Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?

Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Доступ по меткам и позициям»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?

Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Создание Series
  2. Доступ по меткам и позициям
  3. Векторизованные операции над Series
  4. Полезные методы Series
← Назад к Pandas & NumPy Academy