Доступ по меткам и позициям
Получайте элементы с помощью .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 50at и 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 — локальная установка не требуется.
Все уроки этого курса
- Создание Series
- Доступ по меткам и позициям
- Векторизованные операции над Series
- Полезные методы Series