Как я могу получить данные из QTableWidget в Dataframe?

У меня есть 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.


person Rishabh Gupta    schedule 07.06.2016    source источник
comment
Всегда извлекайте данные из интересующей вас модели представления.   -  person Trilarion    schedule 11.06.2016
comment
@Trilarion учтите, что я не использую QTableView, вместо этого я использую QTableWidget, поэтому, пожалуйста, если вы знаете способ получить данные из QTableWidget, ответьте соответствующим образом.   -  person Rishabh Gupta    schedule 13.06.2016
comment
QTableWidget наследуется от QTableView, который наследуется от QAbstractItemView, который содержит QAbstractItemModel, и у вас есть модель. Я рекомендую взаимодействовать с моделью или предоставить свою собственную через QAbstractItemView.setModel.   -  person Trilarion    schedule 13.06.2016
comment
@Trilarion Спасибо за объяснение всего происхождения, я создал свою модель абстракции для вставки в QTableView для другой таблицы, вот она ideone .com/do1Ho6, но я не знаю, как изменить свою модель, чтобы она принимала входные данные, если возможно, помогите. Однако у меня есть один вопрос: в чем польза QTableWidget, если он не создан специально для взаимодействия с пользователем, и если мне вообще нужно его использовать? Кроме того, когда это кажется более распространенной функцией, почему в нее еще не был включен метод?   -  person Rishabh Gupta    schedule 13.06.2016


Ответы (2)


Я думаю, вы немного усложняете это с обновлениями/объединениями. Самый простой подход — сначала создать полноразмерный 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

Приведенный выше код присваивает данные своему местоположению по числовому индексу, поэтому позиция 1,1 в QtTableWidget закончится на 1,1 в DataFrame. Таким образом, вам не нужно беспокоиться о заголовках столбцов при перемещении данных. Если вы хотите изменить имена столбцов, вы можете сделать это при создании DataFrame, изменив значения, переданные в параметр columns=.

Если вы хотите изменить формат столбца на DateTime, вы сможете сделать это за одну операцию после цикла с помощью:

tmp_df['Date'] = pd.to_datetime( tmp_df['Date'] )
person mfitzp    schedule 08.06.2016
comment
какой кадр данных вы подразумеваете под df, здесь, а также как я могу гарантировать, что данные хранятся в правильной ячейке, то есть с соответствующими метками заголовков? большое спасибо за ответ. - person Rishabh Gupta; 10.06.2016
comment
Опечатка, извините, должно быть tmp_df. См. редактирование для более подробного описания. - person mfitzp; 10.06.2016
comment
кажется, есть проблема с вашим методом, по-видимому, он генерирует ошибку ValueError: невозможно установить с помощью позиционного индексирования с увеличением, которое можно решить, используя loc вместо ix , но это все еще не решает мою проблему ссылки на горизонтальные и вертикальные метки для каждый QTableWidgetItem . - person Rishabh Gupta; 16.06.2016

Изменение с .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)
person Jeff    schedule 03.02.2019