Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TableView小部件仅在排序后填充数据_Python_Pandas_Pyqt_Pyqt5 - Fatal编程技术网

Python TableView小部件仅在排序后填充数据

Python TableView小部件仅在排序后填充数据,python,pandas,pyqt,pyqt5,Python,Pandas,Pyqt,Pyqt5,我试图弄清楚如何使用QTableView小部件显示我拥有子集的表。我遇到了一个奇怪的错误,我不确定这是一个错误还是我的代码有问题。我可以很好地加载数据集。当程序运行并按下数据加载按钮时,QTableView将显示正确数量的行和列名,但大部分(如果不是全部)数据丢失。但是,如果您尝试通过单击任何列名对表进行排序,则会显示数据。当我第一次加载数据集时,一些错误消息说,根据定义,我们只有第0个轴,或者我们产生了一个标量 我认为这可能是我使用的csv文件的一个问题,但我能够用随机数字表轻松地重现它。注释

我试图弄清楚如何使用QTableView小部件显示我拥有子集的表。我遇到了一个奇怪的错误,我不确定这是一个错误还是我的代码有问题。我可以很好地加载数据集。当程序运行并按下数据加载按钮时,QTableView将显示正确数量的行和列名,但大部分(如果不是全部)数据丢失。但是,如果您尝试通过单击任何列名对表进行排序,则会显示数据。当我第一次加载数据集时,一些错误消息说,根据定义,我们只有第0个轴,或者我们产生了一个标量

我认为这可能是我使用的csv文件的一个问题,但我能够用随机数字表轻松地重现它。注释掉sort函数仍然不会显示数据,但现在不能使用排序来显示数据。我在示例中使用的代码是对答案的修改

导入必要的包和函数

从PyQt5导入QtCore、QtGui、QtWidgets 作为pd进口熊猫 将numpy作为np导入 类PandasModelQtCore.QAbstractTableModel: def _init__self,df=pd.DataFrame,parent=None: QtCore.QAbstractTableModel.\uuuuu init\uuuuuu self,parent=parent 自。_df=df def headerDataself,节,方向,角色=QtCore.Qt.DisplayRole: 如果角色!=QtCore.Qt.DisplayRole: 返回QtCore.QVariant 如果方向==QtCore.Qt.Horizontal: 尝试: 返回self._df.columns.tolist[部分] 除索引器外: 返回QtCore.QVariant elif方向==QtCore.Qt.Vertical: 尝试: 返回self.df.index.tolist 返回self._df.index.tolist[部分] 除索引器外: 返回QtCore.QVariant def dataself,index,role=QtCore.Qt.DisplayRole: 如果角色!=QtCore.Qt.DisplayRole: 返回QtCore.QVariant 如果index.isValid无效: 返回QtCore.QVariant 返回QtCore.QVariantstrself._df.ix[index.row,index.column] def setDataself、索引、值、角色: 行=自。_df.index[index.row] col=自列[索引列] 如果hasattrvalue为“toPyObject”: PyQt4获取一个QVariant value=value.toPyObject 其他: PySide获得一个unicode dtype=self.\u df[col].dtype 如果数据类型!=对象: 如果value==else dtype.typevalue,则value=None self.\u df.set\u value行、列、值 返回真值 def rowCountself,parent=QtCore.QModelIndex: 返回lenself.\u df.index def columnCountself,父项=QtCore.QModelIndex: 返回lenself.\u df.columns def sortself、列、顺序: colname=self.\u df.columns.tolist[列] self.layoutaboutbechanged.emit self.\u df.sort\u valuescolname,升序=顺序==QtCore.Qt.AscendingOrder,inplace=True self.\u df.reset\u indexinplace=True,drop=True self.layoutChanged.emit 显示表格并处理子集的应用程序

类WidgetQtWidgets.QWidget: def u_init__self,父项=无: qtwidts.QWidget.\uuuuu init\uuuuuuu self,parent=None vLayout=qtwidts.QVBoxLayoutself hLayout=qtwidts.QHBoxLayout self.loadBtn=qtwidts.QPushButtonLoad表,self hLayout.addWidgetself.loadBtn vLayout.addLayouthLayout布局 self.pandasTv=qtwidts.QTableViewself vLayout.addWidgetself.pandasTv self.loadBtn.clicked.connectself.loadTable self.pandasTv.setSortingEnabledTrue def loadTableself: dfNum=pd.DataFramenp.random.randint0100,大小=20,4,列=list'ABCD' dfNumSub=dfNum.loc[dfNum['A'].astypestr.str.contains'1'] 模型=PandasModeldfNumSub self.pandasTv.setModelmodel 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: 导入系统 app=qtwidts.QApplicationsys.argv w=小部件 w、 展示 sys.exitapp.exec_ 我希望所有搜索到的数据都显示出来,而不必对列进行排序


编辑:此错误仅在对数据帧进行子集设置时发生。将代码改为显示dfNum会使所有数据都显示得很好。

使数据显示的不是数据帧本身的排序,而是对self的调用。_df.reset_index在pandamodel.sort的末尾。如果没有此语句,PandaModel.data中对self._df.ix的调用似乎会中断。为了解决这个问题,您可以在Widget.loadTable中设置模型之前尝试应用dfNumSub.reset_index,或者您可以将self._df.ix更改为self._df.iloc在pandamodel.data中,因为DataFrame.ix已经被弃用。

您尝试过用self替换self._df.ix[index.row,index.column]吗?