Применение более чем двух фильтров к DataFrame с помощью оператора & - PullRequest
0 голосов
/ 20 июня 2020

У меня есть df, и я хочу применить множественную фильтрацию этого df.

...
    def applyFilter(self):
        ## 1st Condition
        if self.col1_lineEdit.text() != "":
            self.filter_col1 = (self.myDataFrame['col1'] == self.col1_lineEdit.text())
        else:
            self.filter_col1 = [True] * len(self.myDataFrame) # If line edit is empty, take all values.

        if self.col2_lineEdit.text() != "":
            self.filter_col2 = (self.myDataFrame['col2'] == self.col2_lineEdit.text())
        else:
            self.filter_col2 = [True] * len(self.myDataFrame)

        if self.col3_lineEdit.text() != "":
            self.filter_col3 = (self.myDataFrame['col3'] == self.col3_lineEdit.text())
        else:
            self.filter_col3 = [True] * len(self.myDataFrame)

        ## 2nd conditions
        if self.col4_lineEdit.text() != "":
            self.filter_col4 = (self.myDataFrame['col4'] == self.col4_lineEdit.text())
        else:
            self.filter_col4 = [True] * len(self.myDataFrame)

        if self.col5_lineEdit.text() != "":
            self.filter_col5 = (self.myDataFrame['col5'] == self.col5_lineEdit.text())
        else:
            self.filter_col5 = [True] * len(self.myDataFrame)

        if self.col6_lineEdit.text() != "":
            self.filter_col6 = (self.myDataFrame['col6'] == self.col6_lineEdit.text())
        else:
            self.filter_col6 = [True] * len(self.myDataFrame)
...

это мой метод применить фильтр. После этого я использовал что-то вроде этого:

self.filteredResult = self.myDataFrame[self.filter_col1 & self.filter_col2 & self.filter_col3 & self.filter_col4 & self.filter_col5 & self.filter_col6]

это работает только для фильтрации col1 и col2 . Однако, если я изменю формулу следующим образом (отключите первый операнд с и );

self.filteredResult = self.myDataFrame[self.filter_col1 and self.filter_col2 & self.filter_col3 & self.filter_col4 & self.filter_col5 & self.filter_col6]

, он будет работать для col2 и col3. Итак, я попытался отладить код, а затем получил такую ​​ошибку;

self.filteredResult = self.myDataFrame [self.filter_col1 & self.filter_col2 & self.filter_col3 & self.filter_col4 & self .filter_col5 & self.filter_col6] TypeError: неподдерживаемые типы операндов для &: 'list' и 'list'

Когда я ищу проблему на inte rnet, в каждом решении использовалось не более двух фильтров. Если я применяю два фильтра, проблем нет. Однако мне нужно применить 6 фильтров. Я также искал и пробовал какое-то решение с кодом ошибки. Тоже ничего не получил. Вы можете мне помочь или рассказать что-нибудь о проблеме?

Изменить: я не понял ошибку. Если & операнд не может использоваться в списке. Почему первое и второе не могут применяться к другим?

Важное изменение: я забыл сказать это; если я применяю фильтр в первом или втором столбце, я могу применить другие фильтры. (в данном случае)

self.filteredResult = self.myDataFrame[self.filter_col1 & self.filter_col2 & self.filter_col3 & self.filter_col4 & self.filter_col5 & self.filter_col6]

Насколько я понимаю, программа сравнивает первые два фильтра с операндом &, тогда остальные фильтры зависят от этих фильтров.

Ответы [ 2 ]

0 голосов
/ 25 июня 2020

Чтобы решить эту проблему, мне пришлось добавить столбец, который не повлиял на результаты, но должен был обмануть фильтр. Поэтому я добавляю в свою таблицу дополнительный столбец с именем ALL и заполненный параметром ALL . Затем я отредактировал свой фильтр как:

self.filteredResult = self.myDataFrame[(self.myDataFrame['ALL'] == "ALL") & self.filter_col1 & self.filter_col2 & self.filter_col3 & self.filter_col4 & self.filter_col5 & self.filter_col6]
0 голосов
/ 20 июня 2020

Попробуйте добавить круглые скобки в каждое условие:

self.filteredResult = self.myDataFrame[(self.filter_col1) & (self.filter_col2) & (self.filter_col3) & (self.filter_col4) & (self.filter_col5) & (self.filter_col6)]
...