Использование операторов 'and' и '&' в Boolean индексации Pandas

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

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

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

При работе с булевыми масками в Pandas используйте логические операторы: & для И, | для ИЛИ и ~ для НЕ. Важно помнить о необходимости заключать каждое условие в скобки. Например, для отбора строк из DataFrame используйте следующую конструкцию:

Python
Скопировать код
result = df[(df['A'] > 10) & (df['B'] < 20)]
Кинга Идем в IT: пошаговый план для смены профессии

Скобки приоритетнее: не забываем про порядок выполнения операций

Важность учета порядка следования операторов в Python нельзя недооценивать. Чтобы избегать ошибок и сохранить понятность кода, следует заключать каждое условие в скобки. Ниже показан пример, где выполнение этого правила приводит к ошибке:

Python
Скопировать код
# Результат отличается от ожидаемого. Неприятность!
df[df['A'] > 10 & df['B'] < 20]

Принимаем во внимание приоритет операторов и исправляем ошибку:

Python
Скопировать код
# Теперь результат соответствует ожиданиям.
df[(df['A'] > 10) & (df['B'] < 20)]

Путаница из-за разности между логическими и побитовыми операторами

Следует помнить о различии между побитовыми (&, |) и логическими (and, or) операторами, особенно важной при индексации по булевым маскам в Pandas.

Python
Скопировать код
# Ошибка возникает, если вы используете 'and' вместо '&'.
df[(df['A'] > 10) and (df['B'] < 20)]  # Будет ошибка ValueError

Использование функций any() и all() для разрешения неоднозначности

При работе с Pandas и NumPy важно стремиться к ясности и однозначности. Для разрешения возникающих неясностей используйте функции any() и all().

Python
Скопировать код
df[df['Flags'].any()]

Когда индексация по булевым маскам требует применения булева индексирования

Если задачи, требующие логические операции, становятся слишком сложными, примените методы DataFrame.query() или DataFrame.eval() для их упрощения.

Python
Скопировать код
df.query('(A > 10) & (B < 20)')

Применение логических операторов numpy

При интенсивном использовании логических операций рекомендуется воспользоваться функциями np.logical_and или np.logical_or от NumPy для упрощения работы с условиями.

Python
Скопировать код
np.logical_and.reduce([df['A'] > 10, df['B'] < 20, df['C'] == 30])

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

Индексация по булевым маскам немного похожа на выбор мороженого по предпочитаемому вкусу:

Python
Скопировать код
df[(df['Chocolate'] > 2) & (df['Vanilla'] < 5)]    # Объединение (И)
df[(df['Chocolate'] > 2) | (df['Vanilla'] < 5)]    # Разделение (ИЛИ)

Вот так можно интерпретировать выбор мороженого:

Markdown
Скопировать код
Разнообразие вкусов в киоске 🍨: [🍫🍫🍫, 🍫🍫🍫🍨, 🍨🍨🍨🍨🍨]

🔎 Объединение (И): Выбираем только если 🍫🍫🍫 > 2 И 🍨 < 5
   **Результат**: [🍫🍫🍫]

🔎 Разделение (ИЛИ): Выбираем если 🍫🍫🍫 > 2 ИЛИ 🍨 < 5
   **Результат**: [🍫🍫🍫, 🍫🍫🍫🍨, 🍨🍨🍨🍨🍨]

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

Практика – главный помощник при углублении знаний

Для более глубокого понимания принципа индексации по булевым маскам рекомендуется ознакомиться с следующими ресурсами:

  1. Indexing and selecting data — pandas 2.2.0 documentationДокументация Pandas: незаменимый источник знаний.
  2. Data Indexing and Selection | Python Data Science Handbook — полезнейший ресурс для тех, кто стремиться стать профессионалом в области Data Science.
  3. python – How do you filter pandas dataframes by multiple columns? – Stack OverflowStack Overflow: место для обмена опытом и обсуждения вопросов с единомышленниками.
  4. Boolean Indexing in Pandas – Towards Data Science — пошаговый гайд по индексации по булевым маскам от Towards Data Science.
  5. Pandas Cheat Sheet — Python for Data Science – Dataquestшпаргалка от Dataquest: незаменимый помощник в овладении навыками работы с Pandas.
  6. Notes on Pandas Boolean Indexing by Chris Albon — практические примеры и советы от Криса Албона.