Фильтрация по нескольким столбцам, по нескольким значениям

Подскажите, как работает логика отбора строк.

Код:

portfel.loc[(portfel['Тип'] == ('КК' and 'ОВ')) &
           (portfel['Номер'] == ('279' and '931' and '2667')) &
           (portfel['суммы'] == 'RUR') &
           (portfel['суммы2'] == 'RUR')]['Номер'].sample(5)

Проблема в том, что выводит только номера с записью 2667, вместо всех 3-х.

Поэтому вопрос, как мне передать для всех столбцов много условий сразу?


Ответы (1 шт):

Автор решения: MaxU

почему приведенное в вопросе выражение работает не так как задумывалось?

В Python конструкции "str1" and "str2" and "str3" выполняется следующим образом (слева направо):

  1. проверяется первая строка - bool("str1") - любая непустая строка при проверке будет соответсвовать истинному значению (True)
  2. если первая часть вернула True то проверка идет дальше и проверяется следующая строка
  3. при первом попавшемся выражении False проверка обрывается и возвращается строка, на которой проверка вернула False
  4. елси все строки являются непустыми (при проверке возвращают 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)
→ Ссылка