如何将数据从 QTableWidget 检索到 Dataframe?

Ris*_*pta 3 python pyqt pyqt4 qtablewidget pandas

我有一个处于可编辑模式的 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
Run Code Online (Sandbox Code Playgroud)

另外,我使用以下代码来生成 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)
Run Code Online (Sandbox Code Playgroud)

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

mfi*_*tzp 5

我认为你的更新/连接有点过于复杂了。最简单的方法是首先创建全尺寸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
Run Code Online (Sandbox Code Playgroud)

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

如果您想更改列的格式DateTime,您应该能够在循环后通过单个操作来完成此操作:

tmp_df['Date'] = pd.to_datetime( tmp_df['Date'] )
Run Code Online (Sandbox Code Playgroud)