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

Правило, которое все упускают из виду: как перестать путать 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

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

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

галерея

ИИ почти всех обгонит? Прогнозы звучат громко, но есть нюансы…
Компания Anthropic получила от Amazon 5 миллиардов долларов и в обмен пообещала инвестировать 100 миллиардов долларов в облачные сервисы.
dummy-img
Загрузка: обход банковских систем кибермошенниками и проблемы с удалением углерода.
Загрузка: обход банковских систем кибермошенниками и проблемы с удалением углерода.
dummy-img
dummy-img
Взаимодействие человека и машины погружается под воду.
Взаимодействие человека и машины погружается под воду.
Image Not Found
Компания Anthropic получила от Amazon 5 миллиардов долларов и в обмен пообещала инвестировать 100 миллиардов долларов в облачные сервисы.

Компания Anthropic получила от Amazon 5 миллиардов долларов и в обмен пообещала инвестировать 100 миллиардов долларов в облачные сервисы.

Вкратце Опубликовано: Изображение предоставлено: Thos Robinson/Getty Images для The New York Times (откроется в новом окне) Джули Борт Компания Anthropic получила от Amazon 5 миллиардов долларов и в обмен пообещала инвестировать 100 миллиардов долларов в облачные сервисы.…

Апр 21, 2026
dummy-img

Как почистить виниловые пластинки (2026): пылесос, ультразвук, чистящий раствор, щетка.

Эти щелчки и треск недопустимы. Приведите свою музыку в порядок с помощью этого удобного руководства. Источник: www.wired.com

Апр 21, 2026
Загрузка: обход банковских систем кибермошенниками и проблемы с удалением углерода.

Загрузка: обход банковских систем кибермошенниками и проблемы с удалением углерода.

Это сегодняшний выпуск The Download, нашей ежедневной новостной рассылки, которая предоставляет вам ежедневную порцию событий в мире технологий. Кибермошенники обходят системы безопасности банков с помощью незаконных инструментов, продаваемых в Telegram. В центре по отмыванию денег в Камбодже…

Апр 21, 2026
Загрузка: обход банковских систем кибермошенниками и проблемы с удалением углерода.

Загрузка: обход банковских систем кибермошенниками и проблемы с удалением углерода.

Это сегодняшний выпуск The Download, нашей ежедневной новостной рассылки, которая предоставляет вам ежедневную порцию событий в мире технологий. Кибермошенники обходят системы безопасности банков с помощью незаконных инструментов, продаваемых в Telegram. В центре по отмыванию денег в Камбодже…

Апр 21, 2026

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