Множественная фильтрация DataFrame в Python для использования приложения PyQt5 - PullRequest
1 голос
/ 19 июня 2020
self.myDataFrame = pd.read_csv("myCSV.csv")

def filterValues(self):
    if self.h02_1_lineEdit != "":
        self.h02_1_flag = 1
        self.filter_h02_1 = (self.myDataFrame['H:02-1'] == self.h02_1_lineEdit.text())
    else:
        self.h02_1_flag = 0

    if self.h02_x_lineEdit != "":
        self.h02_x_flag = 1
        self.filter_h02_x = (self.myDataFrame['H:02-X'] == self.h02_x_lineEdit.text())
    else:
        self.h02_x_flag = 0

    # it will take 6 filters in here
    print(self.myDataFrame[self.filter_h02_1 & self.filter_h02_x])

Привет, ребята, у меня есть c приложение в Python с DF для использования в приложении PyQt5. Как видите, я прочитал некоторые данные из файлов csv. И я хочу отфильтровать некоторые значения в соответствии с текстом, написанным на QLineEdit. Однако, если QLineEdit пуст, я не хочу его фильтровать. Но я не мог понять, как это сделать. В других приложениях я могу (и я это сделал) решить эту проблему с помощью флагов. т.е. Sql приложений. Но в этих приложениях мы используем запрос как строки. Так что это было легко использовать.

Моя настоящая проблема здесь - МНОЖЕСТВЕННАЯ ФИЛЬТРАЦИЯ, опять же, если каждое редактирование строки (6-строчное редактирование, которое я использовал) или одно редактирование строки отфильтровано, не вызывает проблем. Но, например, я не хочу использовать self.filter_h02_x и оставлять его пустым. Вот где я застрял. При необходимости я могу загрузить весь код, но я думаю, вы понимаете проблему.

Чтобы прояснить мой вопрос; Если мы можем использовать self.myDataFrame в качестве строки, я могу использовать

self.mainFilter = "self.myDataFrame["  # for definition
...
self.filter_h02_1 = "(self.myDataFrame['H:02-1'] == self.h02_1_lineEdit.text())"
...
if self.h02_1_flag = 1:
     self.myDataFrame += self.filter_h02_1 + "]"
print(self.mainFilter)

Но это не строка, это определение. Если я попытаюсь определить их по очереди, их будет 6! варианты ...

1 Ответ

1 голос
/ 19 июня 2020

Если вы не хотите фильтровать, вы можете использовать маску всех True s

if self.h02_1_lineEdit.text() != "":
    self.filter_h02_1 = (self.myDataFrame['H:02-1'] == self.h02_1_lineEdit.text())
else:
    self.filter_h02_1 = [True] * len(myDataFrame)
...