Короткий ответ
Для фильтрации по условию используют булеву маску, а для одновременного выбора строк и столбцов по условию и названиям — df.loc[маска, список_столбцов].
Как это работает подробнее
булева маска — это Series True/False той же длины, что и DataFrame; df[mask] оставляет строки с True, а df.loc[mask, cols] дополнительно ограничивает набор столбцов за один проход.
Пример кода
Пример Python
import pandas as pd
df = pd.DataFrame({'id': [1, 2, 3, 4], 'amount': [100, -50, 200, 0]})
positive = df.loc[df['amount'] > 0, ['id', 'amount']]
print(positive)Что использовать на практике
- На практике: предпочтительно писать df.loc[df['amount'] > 0, ['id', 'amount']] одной операцией, а не выбирать сначала строки, а потом столбцы через df[mask][['id','amount']] — это избегает цепочечной индексации и связанных с ней предупреждений и неоднозначностей.
- Проверка: результат должен содержать только строки id=1 и id=3, что легко сверить по исходным значениям amount глазами.
Подводные камни
- Частые ошибки: пытаются присвоить значения через df[mask]['col'] = x и получают SettingWithCopyWarning, потому что неясно, работает ли код с копией или с видом исходных данных; забывают скобки при объединении условий через & и |, из-за чего Python неправильно трактует приоритет операторов.