【问题标题】:How can I retrieve data from a QTableWidget to Dataframe?如何将数据从 QTableWidget 检索到 Dataframe?
【发布时间】:2023-03-25 19:50:01
【问题描述】:

我有一个处于可编辑模式的 QTableWidget,用户在其中输入整数输入,我如何生成在此表中输入的数据列表以便对其执行操作,这是我的手动代码:

def dataframe_generation_from_table(self,table):
    number_of_rows = table.rowCount()
    number_of_columns = table.columnCount()

    tmp_df = pd.DataFrame({ 'Date' : [] , str(self.final_lvl_of_analysis) :[],  'Value': []}) 

    for i in range(0,number_of_rows):
        for j in range(0,number_of_columns):
            tmp_item = table.item(i,j)
            tmp_df2 = pd.DataFrame( { 'Date' : [pd.to_datetime(table.horizontalHeaderItem(j).data())] , str(self.final_lvl_of_analysis) :[ str(table.verticalHeaderItem(i).data())], 'Value': [float(tmp_item.data(0))]})
            print tmp_df2
            tmp_df.update(tmp_df2, join = 'left', overwrite = False)

    return tmp_df

另外,我正在使用以下代码生成 QTableWidget:

    self.pd_table = QtGui.QTableWidget(self.groupBox_19)
    self.pd_table.setObjectName(_fromUtf8("pd_table"))
    self.pd_table.setColumnCount(0)
    self.pd_table.setRowCount(0)

我的规格是:pandas 0.18.1、PyQt 4 和 Python 2.7

【问题讨论】:

  • 始终从您感兴趣的视图模型中检索数据。
  • @Trilarion 请考虑我没有使用 QTableView ,而是使用 QTableWidget ,所以如果您知道从 QTableWidget 获取数据的方法,请回复适当的答案。
  • QTableWidget 继承自 QTableView,QTableView 继承自 QAbstractItemView,其中包含一个 QAbstractItemModel 并且你有模型。我建议与模型交互或通过 QAbstractItemView.setModel 提供您自己的模型。
  • @Trilarion 感谢您解释整个父系,我已经创建了用于在 QTableView 中粘贴另一个表的抽象模型,这里是 ideone.com/do1Ho6 但我不知道如何修改我的模型接受输入,如果可能的话做帮助。我确实有一个查询,如果 QTableWidget 不是专门为用户交互而制作的,并且我完全需要使用它,那么它有什么用?此外,当这似乎是一个更常见的功能时,为什么还没有在其中包含一个方法?

标签: python pandas pyqt pyqt4 qtablewidget


【解决方案1】:

我认为你在更新/加入方面有点过于复杂了。最简单的方法是先创建完整大小的DataFrame(填充NaN),然后将数据分配给它:

def dataframe_generation_from_table(self,table):
    number_of_rows = table.rowCount()
    number_of_columns = table.columnCount()

    tmp_df = pd.DataFrame( 
                columns=['Date', str(self.final_lvl_of_analysis), 'Value'], # Fill columnets
                index=range(number_of_rows) # Fill rows
                ) 

    for i in range(number_of_rows):
        for j in range(number_of_columns):
            tmp_df.ix[i, j] = table.item(i, j).data()

    return tmp_df

上面的代码通过数字索引将数据分配给它的位置,因此QtTableWidget 中的位置 1,1 最终将位于DataFrame 中的 1,1。这样,您在移动数据时无需担心列标题。如果要更改列名,可以在创建 DataFrame 时执行此操作,更改传递给 columns= 参数的值。

如果您想将列更改为DateTime 格式,您应该能够在循环后的单个操作中执行此操作:

tmp_df['Date'] = pd.to_datetime( tmp_df['Date'] )

【讨论】:

  • 你所说的 df 是什么数据框,在这里以及如何确保数据存储在正确的单元格中,即带有相应的标题标签?非常感谢您的回复。
  • 错字对不起应该是tmp_df。有关更多说明,请参阅编辑。
  • 您的方法似乎有问题,显然它会生成错误“ValueError: cannot set by positional indexing with increasing”,可以通过使用 loc 而不是 ix 来解决,但这仍然无法解决我为每个 QTableWidgetItem 引用水平和垂直标签的问题。
【解决方案2】:

.data().text() 的更改消除了ValueError

def saveFile(self):
    df = pd.DataFrame()
    savePath = QtGui.QFileDialog.getSaveFileName(None, "Blood Hound", 
        "Testing.csv", "CSV files (*.csv)")        
    rows = self.tableWidget.rowCount()
    columns = self.tableWidget.columnCount()        

    for i in range(rows):            
        for j in range(columns):                
            df.loc[i, j] = str(self.tableWidget.item(i, j).text())              
    df.to_csv((savePath), header = None, index = 0)

【讨论】:

    【解决方案3】:
    # creates a new df from qtables dimensions,
    # copies qtable (data & headers) to the df and returns the df
    @staticmethod
    def write_qtable_to_df(table):
        col_count = table.columnCount()
        row_count = table.rowCount()
        headers = [str(table.horizontalHeaderItem(i).text()) for i in range(col_count)]
    
        # df indexing is slow, so use lists
        df_list = []
        for row in range(row_count):
            df_list2 = []
            for col in range(col_count):
                table_item = table.item(row,col)
                df_list2.append('' if table_item is None else str(table_item.text()))
            df_list.append(df_list2)
    
        df = pandas.DataFrame(df_list, columns=headers)
    
        return df
    

    【讨论】:

      猜你喜欢
      • 2012-08-11
      • 2016-12-18
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多