Технологический фон с цифровыми словами, неоновая графика, инновации, защищенные данные.

Правило, которое все упускают из виду: как перестать путать loc и iloc в Pandas

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

Делиться

a0f9285fc109853a4055f003673ce700

Если вы когда-либо работали с pandas, вы, вероятно, сталкивались с этой классической проблемой: следует ли использовать loc или iloc для извлечения данных? На первый взгляд, они выглядят почти одинаково. Оба используются для нарезки, фильтрации и извлечения строк или столбцов из DataFrame — однако одно крошечное различие в их работе может полностью изменить ваши результаты (или вызвать ошибку, которая заставит вас чесать затылок).

Я помню, как впервые попытался выбрать строку с помощью df.loc[0] и удивился, почему это не сработало. Причина? Pandas не всегда «думает» в терминах позиций — иногда он использует метки. Вот тут и возникает различие между loc и iloc.

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

Представляем набор данных

Набор данных получен из ChatGPT. Он содержит основные записи о результатах экзаменов студентов. Вот снимок нашего набора данных.

import pandas as pd df = pd.read_csv('student_scores.csv') df

Выход:

ccd7ee5cc478a11b24fa5cb8aa2a4651

Я попробую выполнить некоторые задачи по извлечению данных с помощью loc и iloc, например:

  • Извлечение одной строки из DataFrame
  • Извлечение одного значения
  • Извлечение нескольких строк
  • Нарезка диапазона строк
  • Извлечение определенных столбцов и
    Булева фильтрация

Для начала позвольте мне кратко объяснить, что такое loc и iloc в Pandas.

Что такое loc и iloc?

Loc и iloc — это методы извлечения данных в Pandas. Они очень полезны для выбора данных из записей.

Loc использует метки для извлечения записей из DataFrame, поэтому мне проще его использовать. Iloc, однако, полезен для более точного извлечения записей, поскольку Iloc выбирает данные на основе целочисленных позиций строк и столбцов, аналогично тому, как вы индексируете список или массив в Python.

Но если вы, как и я, задаетесь вопросом: если loc явно проще из-за меток строк, зачем вообще использовать iloc? Зачем пытаться вычислять индексы строк, особенно если вы работаете с большими наборами данных? Вот несколько причин.

  • Зачастую наборы данных не содержат четких индексов строк (например, 101, 102, …). Вместо этого используется простой индекс (0, 1, 2, …), или же при извлечении записей может быть допущена ошибка в написании меток строк. В этом случае лучше использовать iloc. Мы также рассмотрим этот вопрос позже в этой статье.
  • В некоторых сценариях, например, при предварительной обработке данных в машинном обучении, метки не имеют особого значения. Вас интересует только моментальный снимок данных. Например, первые или последние три записи. В таких случаях iloc очень полезен. iloc делает код короче и менее уязвимым, особенно если метки меняются, что может привести к сбою модели машинного обучения.
  • Во многих наборах данных встречаются повторяющиеся метки строк. В этом случае iloc всегда работает, поскольку позиции уникальны.
  • В итоге, используйте `loc`, когда ваш набор данных содержит четкие и содержательные метки, и вы хотите, чтобы ваш код был читаемым.
  • Используйте iloc, когда требуется управление на основе положения или когда метки отсутствуют или расположены неаккуратно.

Теперь, когда я внес ясность, вот базовый синтаксис для команд loc и iloc:

df.loc[rows, columns] df.iloc[rows, columns]

Синтаксис практически тот же. Используя этот синтаксис, давайте попробуем получить несколько записей с помощью loc и iloc.

Извлечение одной строки из DataFrame

Для наглядной демонстрации давайте сначала изменим индекс столбца и назначим его student_id. В настоящее время pandas выполняет автоматическую индексацию:

# Установка student_id в качестве индекса df.set_index('student_id', inplace=True)

Вот результат:

d25a684f6b249d9600180264fc0a2c72

Выглядит лучше. Теперь давайте попробуем получить все записи Боба. Вот как это можно сделать с помощью `loc`:

df.loc[102]

Здесь я всего лишь указываю метку строки. Это должно извлечь все записи о Бобе.

Вот результат:

Имя Боб, математика 58, английский 64, наука 70. Имя: 102, тип данных: объект.

Самое замечательное в этом то, что я могу детализировать информацию, создавая своего рода иерархию. Например, давайте попробуем получить конкретную информацию о Бобе, такую как его оценка по математике.

df.loc[102, 'math']

Результатом будет 58.

Теперь давайте попробуем использовать iloc. Если вы знакомы со списками и массивами, индексация всегда начинается с 0. Поэтому, если я хочу получить первую запись в DataFrame, мне нужно указать индекс 0. В данном случае я пытаюсь получить Боба, который является второй строкой в нашем DataFrame — поэтому в этом случае индекс будет равен 1.

df.iloc[1]

В результате мы получим тот же результат, что и выше:

Имя Боб, математика 58, английский 64, наука 70. Имя: 102, тип данных: объект.

А если я попытаюсь получить оценку по математике Боба, наш индекс также будет равен 1, учитывая, что математика находится во второй строке.

df.iloc[1, 1]

Результатом будет 58.

Ладно, на этом я могу закончить статью, но loc и iloc предлагают ещё несколько впечатляющих функций. Давайте быстро рассмотрим некоторые из них.

Извлечение нескольких строк (конкретных студентов)

Pandas позволяет получать несколько строк данных с помощью методов `loc` и `iloc`. Я проведу демонстрацию на примере получения записей нескольких студентов. В этом случае вместо хранения одного значения в методе `loc`/`iloc` мы будем хранить список. Вот как это можно сделать с помощью `loc`:

# Записи Алисы, Чарли и Эдварда df.loc[[101, 103, 105]]

Вот результат:

7b0495142acde60837c2721fc52c920a

Вот как это сделать с помощью iloc:

df.iloc[[0, 2, 4]]

Результат будет тот же:

3abbe0fe00d8206488f55c344dbe6e11

Надеюсь, у вас всё получается.

Выделить диапазон строк

Ещё одна полезная функция Python Pandas — возможность нарезать диапазон строк. Здесь вы можете указать начальную и конечную позицию. Вот синтаксис для нарезки с помощью loc/iloc:

df.loc[start_label:end_label]

Однако в функции `loc` в выходные данные будет включена конечная метка — это совершенно отличается от стандартного среза в Python.

Синтаксис для iloc тот же, за исключением того, что конечная метка будет исключена из выходных данных (точно так же, как и при стандартном срезе в Python).

Давайте рассмотрим пример:

Я пытаюсь получить доступ к записям нескольких студентов. Давайте попробуем сделать это с помощью функции `loc`:

df.loc[101:103]

Выход:

68b1349670542253478a6c1bd8164779

Как вы видите выше, конечная метка включена в результат. Теперь давайте попробуем сделать это с помощью iloc. Если вы помните, индекс первой строки будет равен 0, что означает, что индекс третьей строки будет равен 2.

df.iloc[0:3]

Выход:

0682944f3e18d95e0bc142fa8ae2f850

Здесь исключается третья строка. Но если вы, как и я, часто задаетесь вопросами, то, возможно, задаетесь вопросом: зачем вообще исключать последнюю строку? В каких ситуациях это может быть полезно? А что, если я скажу, что это на самом деле упростит вам жизнь? Давайте быстро это проясним.

Предположим, вы хотите обрабатывать ваш DataFrame порциями по 100 строк каждая.

Если бы нарезка была включающей, вам пришлось бы прибегнуть к сложным математическим вычислениям, чтобы избежать повторения последней строки.

Но поскольку нарезка происходит только в конце, это можно сделать довольно легко, вот так.

df.iloc[0:100] # первые 100 строк df.iloc[100:200] # следующие 100 строк df.iloc[200:300] # следующие 100 строк

Здесь не будет наложений, и размеры фрагментов будут постоянными. Еще одна причина – это сходство с работой диапазонов в Pandas. Обычно, когда вы хотите получить диапазон строк, он также начинается с 0 и не включает последнюю строку. Наличие той же логики в нарезке iLoc очень полезно, особенно при работе с веб-скрейпингом или переборе диапазона строк.

Извлечение данных из определенных столбцов (тем).

Также я хотел бы познакомить вас со знаком двоеточия :. Он позволяет получить все записи в вашем DataFrame с помощью loc. Аналогично символу * в SQL. Преимущество этого метода в том, что вы можете фильтровать и извлекать подмножество столбцов.

Обычно я начинаю именно с этого. Я использую это, чтобы получить общее представление о конкретном наборе данных. Оттуда я могу начать фильтровать и детализировать данные. Позвольте мне показать, что я имею в виду.

Давайте получим все записи:

df.loc[:]

Выход:

c1c9327de40017010566415bfed37e3b

Отсюда я могу извлечь определенные столбцы следующим образом. С помощью loc:

df.loc[:, ['math', 'science']]

Выход:

88036ca22aff866477925ccf3185c068

С помощью iloc:

df.iloc[:, [2, 4]]

Результат будет тем же.

Мне очень нравится эта функция, потому что она очень гибкая. Допустим, я хочу получить оценки Алисы и Боба по математике и естественным наукам. Это будет выглядеть примерно так. Я могу просто указать диапазон записей и столбцов, которые мне нужны.

С местоположением:

df.loc[101:103, ['name', 'math', 'science']]

Выход:

4375a975bea9b61c0dc9dbd0c6c38148

С помощью iloc:

df.iloc[0:3, [0, 1, 3]]

Результат будет тот же.

Булевы фильтры (Кто набрал более 80 баллов по математике?)

Последняя функция, которой я хочу с вами поделиться, — это булевы фильтры. Это позволяет более гибко извлекать данные. Допустим, я хочу получить записи о студентах, набравших более 80 баллов по математике. Обычно в SQL приходится использовать условия WHERE и HAVING. Python значительно упрощает этот процесс.

# Количество студентов, изучающих математику на уровне > 80. df.loc[df['math'] > 80]

Выход:

b957960310197d9b15f62e058775b4bf

Также можно фильтровать по нескольким условиям, используя операторы AND (&), OR (|) и NOT (~). Например:

# Математика > 70 и Естественные науки > 80 df.loc[(df['math'] > 70) & (df['science'] > 80)]

Выход:
3ca46f84dc1cc8b709cf01e7c6451445 P.S. Я написал статью о фильтрации с помощью Pandas. Вы можете прочитать её здесь.

Обычно эта функция используется с loc. С iloc это может быть немного сложнее, поскольку он не поддерживает логические условия. Чтобы сделать это с iloc, вам придется преобразовать логическую фильтрацию в список, например, так:

# Студенты, имеющие математические способности > 80. df.iloc[list(df['math'] > 80)]

Чтобы избежать головной боли, просто сделайте прическу с локоть.

Заключение

При работе с набором данных вы, вероятно, будете часто использовать методы loc и iloc. Поэтому крайне важно понимать, как они работают, и различать их. Мне нравится, насколько легко и гибко извлекать записи с помощью этих методов. Если у вас возникнут вопросы, просто помните, что loc относится к меткам, а iloc — к позициям.

Надеюсь, эта статья оказалась для вас полезной. Попробуйте запустить эти примеры на собственном наборе данных, чтобы увидеть разницу в действии.

Я пишу эти статьи, чтобы проверить и укрепить собственное понимание технических концепций, а также поделиться своими знаниями с другими, кто, возможно, идёт по тому же пути. Не стесняйтесь делиться ими с другими. Давайте учиться и развиваться вместе. Всего доброго!

Не стесняйтесь поздороваться на любой из этих платформ.

Середина

LinkedIn

Твиттер

YouTube

Источник: towardsdatascience.com

✅ Найденные теги: Iloc, Loc, Pandas, новости, Правило, Правило,

ОСТАВЬТЕ СВОЙ КОММЕНТАРИЙ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Каталог бесплатных опенсорс-решений, которые можно развернуть локально и забыть о подписках

галерея

Фото сгенерированных лиц: исследование показывает, что люди не могут отличить настоящие лица от сгенерированных
Нейросети построили капитализм за трое суток: 100 агентов Claude заперли…
Скетч: цифровой осьминог и виртуальный мир внутри компьютера с человечком.
Сцена с жестами пальцами, где один жест символизирует "VPN", а другой "KHP".
‼️Paramount купила Warner Bros. Discovery — сумма сделки составила безумные…
Скриншот репозитория GitHub "Claude Scientific Skills" AI для научных исследований.
Структура эффективного запроса Claude с элементами задачи, контекста и референса.
Эскиз и готовая веб-страница платформы для AI-дизайна в современном темном режиме.
ideipro logotyp
Image Not Found
Звёздное небо с галактиками и туманностями, космос, Вселенная, астрофотография.

Система оповещения обсерватории Рубина отправила 800 000 сигналов в первую ночь наблюдений.

Астрономы будут получать оповещения о небесных явлениях в течение нескольких минут после их обнаружения. Теренс О'Брайен, редактор раздела «Выходные». Публикации этого автора будут добавляться в вашу ежедневную рассылку по электронной почте и в ленту новостей на главной…

Мар 2, 2026
Женщина с длинными тёмными волосами в синем свете, нейтральный фон.

Расследование в отношении 61-фунтовой машины, которая «пожирает» пластик и выплевывает кирпичи.

Обзор компактного пресса для мягкого пластика Clear Drop — и что будет дальше. Шон Холлистер, старший редактор Публикации этого автора будут добавляться в вашу ежедневную рассылку по электронной почте и в ленту новостей на главной странице вашего…

Мар 2, 2026
Черный углеродное волокно с текстурой плетения, отражающий свет.

Материал будущего: как работает «бессмертный» композит

Учёные из Университета штата Северная Каролина представили композит нового поколения, способный самостоятельно восстанавливаться после серьёзных повреждений.  Речь идёт о модифицированном армированном волокном полимере (FRP), который не просто сохраняет прочность при малом весе, но и способен «залечивать» внутренние…

Мар 2, 2026
Круглый экран с изображением замка и горы, рядом электронная плата.

Круглый дисплей Waveshare для креативных проектов

Круглый 7-дюймовый сенсорный дисплей от Waveshare создан для разработчиков и дизайнеров, которым нужен нестандартный экран.  Это IPS-панель с разрешением 1 080×1 080 пикселей, поддержкой 10-точечного ёмкостного сенсора, оптической склейкой и защитным закалённым стеклом, выполненная в круглом форм-факторе.…

Мар 2, 2026

Впишите свой почтовый адрес и мы будем присылать вам на почту самые свежие новости в числе самых первых