ПИТОН

Условный выбор и присвоение с помощью .loc в Pandas

Краткое введение в выбор подмножеств и редактирование DataFrames

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

Если вы уже некоторое время работаете с Pandas, возможно, вы уже сталкивались с ужасным сообщением «SettingwithCopyWarning» при запуске кода. Сначала это может показаться пугающим (поверьте мне, я был там), но все, что он говорит вам, это то, что вы, вероятно, пытаетесь присвоить значение копии объекта Pandas, когда на самом деле вы хотите редактировать фактическое значение.

Для некоторых операций это предупреждение можно обойти, просто добавив параметр inplace=True к любой выполняемой функции. Однако, когда вы работаете с условным выбором, стоит просмотреть несколько примеров, чтобы понять, как правильно внести изменения.

В примерах в этой статье будут использоваться некоторые старые данные о ценах на акции Tesla из Yahoo Finance. Не стесняйтесь запускать приведенный ниже код, если хотите продолжить. Для получения дополнительной информации о pd.read_html и df.sort_values просмотрите ссылки в конце этой статьи.

import pandas as pddf = pd.read_html("https://finance.yahoo.com/quote/TSLA/history?period1=1546300800&period2=1550275200&interval=1d&filter=history&frequency=1d")[0]
df = df.head(11).sort_values(by='Date')
df = df.astype({"Open":'float',
                "High":'float',
                "Low":'float',
                "Close*":'float',
                "Adj Close**":'float',
                "Volume":'float'})
df['Gain'] = df['Close*'] - df['Open']

Использование условных выражений с .loc в Pandas

Если вы раньше вообще не работали с .loc, посмотрите эту статью, чтобы увидеть несколько простых примеров. В противном случае, давайте прямо сейчас!

Получение всех строк, соответствующих простому условному выражению

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

df1 = df.loc[df['Date'] > 'Feb 06, 2019']

И это все!

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

Получение определенных столбцов, соответствующих условному выражению

Теперь мы познакомимся с синтаксисом, который позволяет указать, какие столбцы нужно возвращать .loc. В этом случае мы будем использовать тот же условный оператор, что и раньше, чтобы отфильтровать определенные даты. Однако на этот раз наша цель - выбрать только два столбца (Date и Open) из исходного DataFrame. Для этого запускаем следующий код:

df2 = df.loc[df['Date'] > 'Feb 06, 2019', ['Date','Open']]

Как видите, после условного оператора .loc мы просто передаем список столбцов, которые мы хотели бы найти в исходном DataFrame. Результирующий DataFrame дает нам только столбцы Date и Open для строк со значением Date больше 6 февраля 2019 г.

Но что, если мы хотим отфильтровать по нескольким условиям? Давайте продолжим.

Использование нескольких условных операторов для фильтрации DataFrame

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

df3 = df.loc[(df['Date'] > 'Feb 06, 2019') & (df['Open'] > 62), ['Date', 'Open']]

Как видите, мы просто добавили еще одно условие, добавив знак &, чтобы указать, что мы хотим, чтобы выполнялись оба условия (обратите внимание, что знак | также будет работать для «или»). Мы также заключили каждое условное выражение в круглые скобки для наглядности. В результате получается очень небольшое подмножество исходного DataFrame, содержащее только строки, удовлетворяющие нашим двум условиям.

Теперь, когда мы рассмотрели все компоненты, мы готовы вносить изменения в наш DataFrame!

Редактирование DataFrame на основе нескольких условных операторов

Как упоминалось ранее, могут быть другие способы сделать это, но вы можете получить «SettingwithCopyWarning», если не будете осторожны. Использование .loc для присвоения значений решит эту проблему за вас!

Мы соберем все предыдущие шаги и отредактируем наш DataFrame, чтобы строкам, отвечающим заданному нами условию, было присвоено определенное значение. В этом случае мы создадим новый столбец «Замечательный», который будет включать строки с очень большим объемом или положительным приростом. Для этого запускаем следующий код:

remarkable_filter = (df['Volume'] > 30000000) | (df['Gain'] > 0)
df4 = df.copy()
df4['Remarkable'] = ''
df4.loc[remarkable_filter, ['Remarkable']] = True
df4.loc[~remarkable_filter, ['Remarkable']] = False

Для ясности мы помещаем наши условные операторы в отдельную переменную, которая используется позже в .loc. Затем мы присваиваем либо True столбцу Remarkable для всех строк, соответствующих нашим условным операторам. Мы используем символ ~, чтобы найти все строки, которые не соответствуют нашему условному выражению, а затем присваиваем False столбцу Remarkable для этих строк.

И это все!

Я надеюсь, что вы нашли это полезным для дальнейшего понимания .loc и того, как вы можете использовать его для фильтрации и редактирования фреймов данных в Pandas! Таким образом, вы также будете в безопасности от «SettingwithCopyWarning», потому что все, что мы делаем, - это следуем инструкциям предупреждения:

Try using .loc[row_indexer, col_indexer] = value instead

Удачи в приключениях Панд!

More by me:
- Don’t Miss Out on Rolling Window Functions in Pandas
- 4 Different Ways to Efficiently Sort a Pandas DataFrame
- Top 4 Repositories on GitHub to Learn Pandas
- How to Quickly Create and Unpack Lists with Pandas
- Learning to Forecast With Tableau in 5 Minutes Or Less