Как можно выделить ячейку с самым высоким значением в каждой строке в представлении таблицы PyQT4 - PullRequest
0 голосов
/ 08 мая 2019

Я очень плохо знаком с PyQT и наткнулся на следующее препятствие. Я создал DataFrame для панд и сумел визуализировать его в виде таблицы pyqt4 с помощью некоторого кода, найденного в другом потоке ( Самый быстрый способ заполнения QTableView из фрейма данных Pandas ). Теперь я хочу выделить самое высокое значение в каждой строке.

В настоящее время код, который я использую для загрузки DataFrame pandas в табличное представление, выглядит следующим образом:

class PandasModel(QtCore.QAbstractTableModel):
    """
    Class to populate a table view with a pandas dataframe
    """
    def __init__(self, data, parent=None):
        QtCore.QAbstractTableModel.__init__(self, parent)
        self._data = data

    def rowCount(self, parent=None):
        return len(self._data.values)

    def columnCount(self, parent=None):
        return self._data.columns.size

    def data(self, index, role):
        if index.isValid():
            if role == QtCore.Qt.DisplayRole:
                return str(self._data.values[index.row()][index.column()])
        return None

    def headerData(self, col, orientation, role):
        if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
            return self._data.columns[col]
        return None

Я понятия не имею, возможно ли достичь этого с помощью этого метода, поскольку я не думаю, что достаточно хорошо понимаю структуру PyQT, поэтому любое решение приветствуется.

Желаемый результат, который я имею в виду, в конечном итоге выглядел бы как это например

Заранее спасибо!

1 Ответ

0 голосов
/ 08 мая 2019

enter image description here

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QTreeWidgetItem
import sys
import pandas as pd
import numpy as np

class PandasModel(QtCore.QAbstractTableModel):
    """
    Class to populate a table view with a pandas dataframe
    """
    def __init__(self, data, parent=None):
        QtCore.QAbstractTableModel.__init__(self, parent)
        self._data = data

    def rowCount(self, parent=None):
        return len(self._data.values)

    def columnCount(self, parent=None):
        return self._data.columns.size

    def data(self, index, role):
        if index.isValid():
            if role == QtCore.Qt.DisplayRole:
                return str(self._data.values[index.row()][index.column()])
            if role == QtCore.Qt.BackgroundColorRole:
                row = index.row()
                col = index.column()
                if self._data.iloc[row,col] == self._data.iloc[row].max():
                    color = QtGui.QColor('red')
                else:
                    color = QtGui.QColor('white')
                pixmap = QtGui.QPixmap(26, 26)
                pixmap.fill(color)
                return color
        return None

    def headerData(self, col, orientation, role):
        if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
            return self._data.columns[col]
        return None

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    df = pd.DataFrame(np.random.randn(8,3).round(3))

    view = QtWidgets.QTableView()
    view.setModel(PandasModel(df))

    view.show()
    sys.exit(app.exec_())
...