Фильтрация по нескольким столбцам, по нескольким значениям
Подскажите, как работает логика отбора строк.
Код:
portfel.loc[(portfel['Тип'] == ('КК' and 'ОВ')) &
(portfel['Номер'] == ('279' and '931' and '2667')) &
(portfel['суммы'] == 'RUR') &
(portfel['суммы2'] == 'RUR')]['Номер'].sample(5)
Проблема в том, что выводит только номера с записью 2667, вместо всех 3-х.
Поэтому вопрос, как мне передать для всех столбцов много условий сразу?
Ответы (1 шт):
почему приведенное в вопросе выражение работает не так как задумывалось?
В Python конструкции "str1" and "str2" and "str3" выполняется следующим образом (слева направо):
- проверяется первая строка -
bool("str1")- любая непустая строка при проверке будет соответсвовать истинному значению (True) - если первая часть вернула
Trueто проверка идет дальше и проверяется следующая строка - при первом попавшемся выражении
Falseпроверка обрывается и возвращается строка, на которой проверка вернулаFalse - елси все строки являются непустыми (при проверке возвращают
True), то вернется последняя строка
Примеры:
In [32]: ('279' and '931' and '2667')
Out[32]: '2667'
In [33]: ('279' and '' and '2667')
Out[33]: ''
Таким образом команда:
portfel['Номер'] == ('279' and '931' and '2667'))
эквивалентна команде:
portfel['Номер'] == '2667'
воспользуйтесь методом DataFrame.query("...")
- имена столбцов, содержащие пробелы или символы не латинского алфавита необходимо заключить в обратные кавычки (backtick quoted):
qry = "`Тип` in ['KK','OB'] and `Номер` in ['279','931','2667'] \
and `суммы` == 'RUR' and `суммы2` == 'RUR'"
res = portfel.query(qry)
или так:
res = portfel.loc[
(portfel['Тип'].isin(['KK','OB']))
& (portfel['Номер'].isin(['279','931','2667']))
& (portfel['суммы'] == 'RUR')
& (portfel['суммы2'] == 'RUR')
]
На будущее рекомендую всегда использовать только буквы латинского алфавита для имён столбцов - это позволит использовать имена столбцов без необходимости заключать их в обратные кавычки:
qry = "Type in ['КК','ОВ'] and Number in ['279','931','2667'] \
and Sum == 'RUR' and Sum2 == 'RUR'"
res = portfel.query(qry)