【问题标题】:Is it possible to involve a search bar on a DataFrame in Pandas?是否可以在 Pandas 的 DataFrame 上包含搜索栏?
【发布时间】:2020-09-15 14:56:26
【问题描述】:

我在 Pandas 中有一个 DataFrame,它从 Excel 文档中收集一些数据。为了让它看起来更有趣,我用 PyQt5 创建了一个 GUI,但事情就是这样。

是否可以制作一个动态搜索栏来搜索该 DataFrame?例如,我的 DataFrame 有超过 3k+ 行,我想搜索 John Doe,然后结果将出现在 GUI 上。据我所知,QLineEdit 用于此目的,但我似乎无法在我的代码中实现它。

是我做错了还是不能在 DataFrame 上做?如果有人想帮助我,请告诉我,我会非常感激和感激,我想只需要 10-15 分钟。我也可以在这里发布代码,但是在 Discord 上讨论并详细解释您以及共享屏幕会容易得多。

【问题讨论】:

    标签: python-3.x pandas dataframe user-interface pyqt5


    【解决方案1】:

    这可以通过子类化QAbstractTableModel 来创建一个自定义表模型,该模型使用底层数据框向QTableView 提供数据。然后可以将此自定义模型与QProxyFilterSortModel 组合以过滤表中的数据。要从QAbstractTableModel 创建自定义不可编辑模型,您至少需要实现rowCountcolumnCountdataheaderData。在这种情况下,最小实现可能是这样的:

    class DataFrameModel(QtCore.QAbstractTableModel):
        def __init__(self, data_frame, parent = None):
            super().__init__(parent)
            self.data_frame = data_frame
    
        def rowCount(self, index):
            if index.isValid():
                return 0
            return self.data_frame.shape[0]
    
        def columnCount(self, index):
            if index.isValid():
                return 0
            return self.data_frame.shape[1]
    
        def data(self, index, role):
            if not index.isValid() or role != QtCore.Qt.DisplayRole:
                return None
            return str(self.data_frame.iloc[index.row(), index.column()])
    
        def headerData(self, section, orientation, role=None):
            if role != QtCore.Qt.DisplayRole:
                return None
            if orientation == QtCore.Qt.Vertical:
                return self.data_frame.index[section]
            else:
                return self.data_frame.columns[section]
    

    要显示和过滤表格中的数据,您可以执行以下操作:

    class MyWidget(QtWidgets.QWidget):
        def __init__(self, parent = None):
            super().__init__(parent)
            self.table_view = QtWidgets.QTableView()
    
            self.proxy_model = QtCore.QSortFilterProxyModel()
            # by default, the QSortFilterProxyModel will search for keys in the first column only
            # setting QSortFilterProxyModel.filterKeyColumn to -1 will match values in all columns
            self.proxy_model.setFilterKeyColumn(-1)
            self.table_view.setModel(self.proxy_model)
    
            # line edit for entering (part of) the key that should be searched for
            self.line_edit = QtWidgets.QLineEdit()
            self.line_edit.textChanged.connect(self.filter_text)
    
            vlayout = QtWidgets.QVBoxLayout(self)
            vlayout.addWidget(self.line_edit)
            vlayout.addWidget(self.table_view)
    
        def filter_text(self, text):
            self.proxy_model.setFilterFixedString(text)
    
        def set_data(self, data):
            self.model = DataFrameModel(pd.DataFrame(data))
            self.proxy_model.setSourceModel(self.model)
    
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication([])
        win = MyWidget()
        win.set_data({'a':['apple', 'banana', 'cherry'], 'b':[4,5,6], 'c':['green', 'yellow', 'red']})
        win.show()
        app.exec()
    

    当然,这是一个非常基本的实现,但我可能会帮助您入门。

    【讨论】:

      【解决方案2】:

      我认为图书馆 pandas_ui 是您在这里寻找的。​​p>

      它允许您以交互方式使用数据框,即以 microsoft excel 方式。特别是,列过滤选项应该可以满足您的需求。

      【讨论】:

        猜你喜欢
        • 2013-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-25
        • 2015-12-30
        • 2011-11-21
        相关资源
        最近更新 更多