Выборка из pandas.DataFrame с условиями по двум колонкам

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для фильтрации данных в pandas применяйте индексацию с булевыми выражениями, оборачивайте условия скобками и применяйте побитовые операторы. Вот пример:

Python
Скопировать код
# Критерии: (A > 2) И (B < 5) ИЛИ (C == 'foo')
filtered_df = df[((df['A'] > 2) & (df['B'] < 5)) | (df['C'] == 'foo')]

Таким образом, можно отобрать строки, соответствующие условиям: 'A' больше 2 при условии, что 'B' меньше 5, либо 'C' равно 'foo'.

Кинга Идем в IT: пошаговый план для смены профессии

Углублённый раздел: следуем лучшим практикам

Воспользуйтесь .loc для продвинутого индексирования

Метод .loc позволяет безопасно просматривать и модифицировать данные, используя булевы ряды:

Python
Скопировать код
# Пример использования .loc
result = df.loc[(df['Column1'] > 10) & (df['Column2'] != 'ExcludedValue')]

Здесь скобки по обе стороны условий гарантируют корректное применение оператора &, который является аналогом логического "И". Метод .loc помогает предотвратить ошибки, связанные с тем, что pandas не всегда возвращает ожидаемую копию или представление данных.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Присвойте условия переменным

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

Python
Скопировать код
condition = (df['Column1'] > 10) & (df['Column2'] != 'ExcludedValue')
result = df.loc[condition]

Рассмотрите метод query

Метод query предоставляет компактный и интуитивно понятный способ фильтрации данных:

Python
Скопировать код
result = df.query('Column1 > 10 and Column2 != "ExcludedValue"')

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

Избегайте цепочечного индексирования

Цепочечное индексирование (доступ к значениям по нескольким индексам подряд, например, df[df['Column1'] > 10]['Column2']) может вызвать проблемы. Желательно использовать метод .loc, который исключает неоднозначности, связанные с таким индексированием.

Как избежать распространённых ошибок

При выборке данных важно учесть:

  • Синтаксические ошибки и опечатки, которые могут привести к некорректным результатам.
  • Правильное использование булевой логики: обратите внимание на правильное использование операторов & и |, а также на заключение условий в скобки.
  • Неэффективное использование кода, особенно при обработке больших DataFrame.

Визуализация

Можно представить процесс фильтрации как отбор яблок в соответствии с заданными условиями:

🍏🍏🍏      ------------------|------------------
     x > 1 |   x <= 1 (отбрасываем)
Критерии ⬇️ |
y >= 3 & z < 5 |

В результате мы получаем корзину с яблоками, которые соответствуют требуемым условиям:

🧺 Выбранные яблоки: [🍏(x=2, y=3, z=4), 🍏(x=3, y=4, z=2)]

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

Использование np.bitwise_and.reduce

С помощью np.bitwise_and.reduce можно эффективно обрабатывать множество условий:

Python
Скопировать код
conditions = [(df['Column1'] > 10), (df['Column2'] != 'ExcludedValue')]
result = df.loc[np.bitwise_and.reduce(conditions)]

Комбинирование списка условий, меняющихся в ходе выполнения

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

Python
Скопировать код
conditions = [df[col] > threshold for col, threshold in criteria_dict.items()]
filtered_df = df.loc[np.bitwise_and.reduce(conditions)]

Использование метода merge для сложного слияния

Для слияния DataFrame по сложным критериям можно использовать метод .merge:

Python
Скопировать код
df1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                    'A': ['A0', 'A1', 'A2', 'A3']})

df2 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                    'B': ['B0', 'B1', 'B2', 'B3']})

result = pd.merge(df1, df2, on='key', how='inner')

Полезные материалы

  1. Документация pandas 2.2.0 по методу query — использование query для фильтрации данных.
  2. Индексирование и выбор данных — документация pandas 2.2.0 — подробности об индексации с использованием булевых условий.
  3. Обсуждение на Stack Overflow о фильтрации DataFrame с использованием нескольких столбцов — различные подходы к фильтрации данных.
  4. Руководство NumPy по logical_and — обработка нескольких массивов с помощью logical_and.
  5. Улучшение производительности в pandas — документация pandas 2.2.0 — оптимизация работы с булевыми выражениями.
  6. Документация pandas о методе merge — объединение DataFrame посредством метода merge.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой оператор является логическим 'И' при выборке данных в pandas?
1 / 5