Используйте df.loc[(df['col1'] > 1) & (df['col1'] < 3)]. Условия объединяются поэлементным &, каждое сравнение заключается в скобки. Для исходных строк [1, 'A'], [2, 'B'], [3, 'C'] останется только строка с индексом 1: col1 = 2, col2 = 'B'. Значения на границах 1 и 3 исключаются.
Как в pandas выбрать строки, где col1 больше 1 и меньше 3?
Фильтрация DataFrame двумя строгими условиями: булева маска, оператор & и скобки. Показываем результат для исходных трех строк без изменения индекса.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дан DataFrame. Нужно выбрать строки, в которых значение col1 строго больше 1 и строго меньше 3.
import pandas as pd
df = pd.DataFrame(
[[1, 'A'], [2, 'B'], [3, 'C']],
columns=['col1', 'col2'],
)
Решение
result = df.loc[(df['col1'] > 1) & (df['col1'] < 3)]
print(result)
Вывод:
col1 col2
1 2 B
Первая маска равна [False, True, True], вторая — [True, True, False]. Поэлементное пересечение дает [False, True, False], поэтому остается только вторая строка исходного набора. Ее индекс по-прежнему равен 1: фильтрация сама не перенумеровывает строки.
Частые ошибки
Для объединения Series нельзя использовать обычный Python-оператор and: он пытается получить одно логическое значение объекта, а здесь нужна отдельная проверка для каждой строки. Нужен &, причем сравнения следует заключать в скобки из-за приоритетов операторов.
Не заменяйте строгие сравнения на >= и <=: тогда в результат попадут граничные значения, что противоречит условию. Если после отбора действительно требуется индекс от нуля, это отдельная операция result.reset_index(drop=True), а не часть исходной задачи.
Для n строк оба сравнения и фильтрация требуют линейного прохода; булевы маски и результат занимают дополнительную память. Вопросы типов и пропущенных значений нужно оговаривать для более общего входа: в данном примере col1 содержит обычные целые числа. Механизм описан в документации pandas: boolean indexing.