Использование операторов 'and' и '&' в Boolean индексации Pandas
Быстрый ответ
При работе с булевыми масками в Pandas используйте логические операторы: &
для И, |
для ИЛИ и ~
для НЕ. Важно помнить о необходимости заключать каждое условие в скобки. Например, для отбора строк из DataFrame используйте следующую конструкцию:
result = df[(df['A'] > 10) & (df['B'] < 20)]
Скобки приоритетнее: не забываем про порядок выполнения операций
Важность учета порядка следования операторов в Python нельзя недооценивать. Чтобы избегать ошибок и сохранить понятность кода, следует заключать каждое условие в скобки. Ниже показан пример, где выполнение этого правила приводит к ошибке:
# Результат отличается от ожидаемого. Неприятность!
df[df['A'] > 10 & df['B'] < 20]
Принимаем во внимание приоритет операторов и исправляем ошибку:
# Теперь результат соответствует ожиданиям.
df[(df['A'] > 10) & (df['B'] < 20)]
Путаница из-за разности между логическими и побитовыми операторами
Следует помнить о различии между побитовыми (&
, |
) и логическими (and
, or
) операторами, особенно важной при индексации по булевым маскам в Pandas.
# Ошибка возникает, если вы используете 'and' вместо '&'.
df[(df['A'] > 10) and (df['B'] < 20)] # Будет ошибка ValueError
Использование функций any() и all() для разрешения неоднозначности
При работе с Pandas и NumPy важно стремиться к ясности и однозначности. Для разрешения возникающих неясностей используйте функции any()
и all()
.
df[df['Flags'].any()]
Когда индексация по булевым маскам требует применения булева индексирования
Если задачи, требующие логические операции, становятся слишком сложными, примените методы DataFrame.query()
или DataFrame.eval()
для их упрощения.
df.query('(A > 10) & (B < 20)')
Применение логических операторов numpy
При интенсивном использовании логических операций рекомендуется воспользоваться функциями np.logical_and
или np.logical_or
от NumPy для упрощения работы с условиями.
np.logical_and.reduce([df['A'] > 10, df['B'] < 20, df['C'] == 30])
Визуализация
Индексация по булевым маскам немного похожа на выбор мороженого по предпочитаемому вкусу:
df[(df['Chocolate'] > 2) & (df['Vanilla'] < 5)] # Объединение (И)
df[(df['Chocolate'] > 2) | (df['Vanilla'] < 5)] # Разделение (ИЛИ)
Вот так можно интерпретировать выбор мороженого:
Разнообразие вкусов в киоске 🍨: [🍫🍫🍫, 🍫🍫🍫🍨, 🍨🍨🍨🍨🍨]
🔎 Объединение (И): Выбираем только если 🍫🍫🍫 > 2 И 🍨 < 5
**Результат**: [🍫🍫🍫]
🔎 Разделение (ИЛИ): Выбираем если 🍫🍫🍫 > 2 ИЛИ 🍨 < 5
**Результат**: [🍫🍫🍫, 🍫🍫🍫🍨, 🍨🍨🍨🍨🍨]
Так выбирайте логические операторы для фильтрации данных так, как бы вы выбрали свой любимый вкус мороженого.
Практика – главный помощник при углублении знаний
Для более глубокого понимания принципа индексации по булевым маскам рекомендуется ознакомиться с следующими ресурсами:
- Indexing and selecting data — pandas 2.2.0 documentation — Документация Pandas: незаменимый источник знаний.
- Data Indexing and Selection | Python Data Science Handbook — полезнейший ресурс для тех, кто стремиться стать профессионалом в области Data Science.
- python – How do you filter pandas dataframes by multiple columns? – Stack Overflow — Stack Overflow: место для обмена опытом и обсуждения вопросов с единомышленниками.
- Boolean Indexing in Pandas – Towards Data Science — пошаговый гайд по индексации по булевым маскам от Towards Data Science.
- Pandas Cheat Sheet — Python for Data Science – Dataquest — шпаргалка от Dataquest: незаменимый помощник в овладении навыками работы с Pandas.
- Notes on Pandas Boolean Indexing by Chris Albon — практические примеры и советы от Криса Албона.