Выборка из 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 не всегда возвращает ожидаемую копию или представление данных.

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

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

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.