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

Простые методы доступа:

Собственные объекты Python предоставляют хорошие способы индексации данных. Pandas поддерживает все это, что упрощает начало работы.

В этом руководстве мы будем использовать фрейм данных обзоров, содержащий CSV-файл обзоров, загруженный с kaggle.

Давайте попробуем, например, выбрать столбец описания из DataFrame, мы можем сделать это как в случае доступа к атрибуту объекта с помощью review.description, так и в случае доступа к элементу в словаре с помощью review['description '].

# first method
desc = reviews.description
# Second method
desc = reviews['description']

В основном нет разницы между двумя методами, но второй метод имеет преимущество, например, когда имя столбца содержит пробел.

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

desc = reviews['description'][0]

Индексирование в пандах:

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

В python есть две парадигмы индексации: первая — это выбор на основе индекса, который выбирает данные на основе их числовой позиции в данных.

Чтобы выбрать первую строку данных в DataFrame, мы можем использовать следующее:

reviews.iloc[0]

И loc, и iloc идут первой строкой, второй столбец. Это противоположно тому, что мы делаем в нативном Python, где сначала столбец, а затем строка.

Это означает, что получить строки немного проще, а столбцы — немного сложнее. Чтобы получить столбец с iloc, мы можем сделать следующее:

reviews.iloc[:, 0]

оператор «:» означает, что мы хотим извлечь все строки, его можно использовать таким образом, чтобы выбрать «Все», или мы можем использовать его для выбора диапазона строк.

например, review.iloc(:3,0) будет выбирать строки, начиная со строки с индексом 0 и заканчивая строкой с индексом 2.

мы также можем выбрать строку с индексом 1 в строку с индексом 20, например, запустив ячейку ниже

reviews.iloc[1:21, 0]

Передача списка также возможна:

reviews.iloc[[0, 1, 2], 0]

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

reviews.iloc[-5:]

Вторая парадигма выбора атрибутов — это та, за которой следует оператор loc: выбор на основе меток. В этой парадигме важно значение индекса данных, а не его положение.

Например, чтобы получить первую запись в reviews, мы должны сделать следующее:

reviews.loc[0, 'country']

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

reviews.loc[:, ['taster_name', 'taster_twitter_handle', 'points']]

Выбор между loc и iloc

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

iloc использует схему индексации Python stdlib, где первый элемент диапазона включается, а последний исключается. Итак, 0:10 выберет записи 0,...,9. loc, тем временем, индексы включительно. Итак, 0:10 выберет записи 0,...,10.

Почему изменение? Помните, что loc может индексировать любой тип stdlib: строки, например. Если у нас есть DataFrame со значениями индекса Apples, ..., Potatoes, ..., и мы хотим выбрать «все варианты фруктов в алфавитном порядке между яблоками и картофелем», то гораздо удобнее индексировать df.loc['Apples':'Potatoes'], чем индексировать что-то вроде df.loc['Apples', 'Potatoet] (t идет после s в алфавит).

Это особенно сбивает с толку, когда индекс DataFrame представляет собой простой числовой список, например. 0,...,1000. В этом случае df.iloc[0:1000] вернет 1000 записей, а df.loc[0:1000] вернет 1001 из них! Чтобы получить 1000 элементов, используя loc, вам нужно будет перейти на один ниже и запросить df.loc[0:999].

В остальном семантика использования loc такая же, как и для iloc.

Управление индексом:

Манипулировать индексом в python действительно легко, если вы обнаружите, что один из столбцов — это DataFrame, который хорошо работает для индекса, все, что вам нужно сделать, это запустить ячейку ниже:

reviews.set_index("title")

Условный выбор:

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

Мы можем начать с проверки того, является ли каждое вино итальянским или нет:

reviews.country == 'Italy'

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

reviews.loc[reviews.country == 'Italy']

Мы также хотели знать, какие из них лучше среднего. Вина оцениваются по шкале от 80 до 100 баллов, поэтому это могут быть вина, набравшие не менее 90 баллов.

Мы можем использовать амперсанд (&), чтобы объединить два вопроса:

reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)]

Предположим, мы купим вино итальянского производства или с рейтингом выше среднего. Для этого используем трубу (|):

reviews.loc[(reviews.country == 'Italy') | (reviews.points >= 90)]

мы также можем использовать встроенный селектор isin. isin позволяет выбрать данные, значение которых «находится в» списке значений. Например, вот как мы можем использовать его для выбора вин только из Италии или Франции:

reviews.loc[reviews.country.isin(['Italy', 'France'])]

другой встроенный селектор — isnull (и его компаньон notnull). Эти методы позволяют выделить значения, которые являются (или не являются) пустыми (NaN). Например, чтобы отфильтровать вина без ценника в наборе данных, мы должны сделать следующее:

reviews.loc[reviews.price.notnull()]

Назначение данных:

С другой стороны, присвоить данные DataFrame очень просто. Вы можете присвоить любое постоянное значение:

reviews['critic'] = 'everyone'

Или с итерацией значений:

reviews['index_backwards'] = range(len(reviews), 0, -1)
reviews['index_backwards']

В этом руководстве мы рассмотрели, как индексировать, выбирать и назначать данные для DataFrame, это действительно важно при попытке изменить определенные значения в DataFrame, в следующем руководстве мы рассмотрим сводные функции и карты.