2016-06-07 22 views
0

ich einen QTableWidget in editierbare Modus haben, in dem Benutzer in Integer-Eingang setzt, wie kann ich eine Liste der eingegebenen Daten in dieser Tabelle erzeugen, um Operationen darauf auszuführen, hier ist meine Hand-Code dafür:Wie kann ich Daten von einem QTableWidget abrufen?

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 

auch ich bin mit dem folgenden Code für QTableWidget Generation:

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) 

Meine Spezifikationen sind: Pandas 0.18.1, PyQt 4 und Python 2,7

Edit: Ich bin ein Neuling für PyQt, bitte helfen.

+0

Daten abrufen immer aus dem Modell der Ansicht, die Sie interessieren – Trilarion

+0

@Trilarion denken Sie bitte, dass ich QTableView nicht verwende, stattdessen verwende ich QTableWidget, also bitte, wenn Sie einen Weg kennen, um Daten von einem QTableWidget zu bekommen, antworten Sie mit einer passenden Antwort. –

+0

QTableWidget erbt von QTableView, das von QAbstractItemView erbt, das ein QAbstractItemModel enthält, und dort haben Sie das Modell. Ich empfehle, mit dem Modell zu interagieren oder eigene über QAbstractItemView.setModel bereitzustellen. – Trilarion

Antwort

2

Ich denke, dass Sie es ein wenig mit den Updates/Joins overcomplicieren. Der einfachste Ansatz ist es, die in voller Größe DataFrame ersten (gefüllt mit NaN) und weisen Sie dann die Daten an diese zu erstellen:

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 

Der obige Code ordnet Daten zu seiner Lage durch den numerischen Index, so Position 1,1 in der QtTableWidget wird bei 1,1 in der DataFrame enden. Auf diese Weise müssen Sie sich beim Verschieben von Daten nicht um die Spaltenüberschriften kümmern. Wenn Sie die Spaltennamen ändern möchten, können Sie das beim Erstellen der DataFrame ändern, indem Sie die Werte ändern, die an den Parameterübergeben werden.

Wenn Sie eine Spalte zu DateTime Format ändern mögen, sollten Sie in der Lage sein, diese mit nach der Schleife in einem einzigen Vorgang zu tun:

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

Welchen Datenrahmen meinen Sie mit df, hier und auch wie kann ich sicherstellen, dass die Daten in der richtigen Zelle gespeichert werden, d. H. Mit den entsprechenden Header-Labels? Vielen Dank für die Antwort. –

+0

Typo sorry, das sollte 'tmp_df' sein. Siehe die Bearbeitung für weitere Beschreibung. – mfitzp

+0

scheint es ein Problem mit Ihrer Methode zu geben, anscheinend erzeugt es einen Fehler "ValueError: kann nicht durch Positionsindexierung mit Vergrösserung eingestellt werden", der gelöst werden kann, indem loc statt ix verwendet wird, aber das behebt mein Problem der Referenzierung der horizontalen und vertikale Labels für jedes QTableWidgetItem. –