如何控制特定 PyQt5 QTableView 列中的数据类型?

问题描述 投票:0回答:1

(注:这是我在这里发表的第一篇文章,我认为自己是 Python 的“行家”)

问题总结:

  • 我有一个 PyQt5 QTableView,通过抽象表模型由 pandas 数据框填充

  • 单选按钮组允许用户在两个数据帧之间切换表格

  • 两个数据帧均确认第 1 列为整数,但表格视图仅针对还包含其他浮点数的数据帧显示带有“.0”的数字。

  • 我想知道为什么会发生这种情况以及如何解决它。

  • 第一个数据帧包含所有整数,但第二个数据帧仅在第 1 列(第一个非索引列)中包含整数

  • 第一列对于两个表来说是相同的,正如打印数据帧内容所确认的那样

数据帧 self.freq_df

freq dataframe print ...

数据帧 self.prob_df

prob dataframe print ...

  • 但是,当我使用单选按钮切换到第二个数据帧时,它会将整数显示为小数到一位:

概率表内容截图

Screenshot of prob table contents

概率表内容截图 Screenshot of prob table contents

以下是我希望的相关代码片段:

class PandasModel(QtCore.QAbstractTableModel):
    
    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=QtCore.Qt.DisplayRole):
        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
        # layout 
        self.freq_table = QTableView(self)
        self.freq_tab.setLayout(self.freq_tab.layout)
self.freq_model = PandasModel(self.freq_df)
    self.prob_df = self.freq_df.copy()
    for col in range(1,8):
        probtemp = self.prob_df.iloc[:, col]/self.prob_df.iloc[:, col].sum()
        self.prob_df.iloc[:, col] = probtemp.round(decimals = 4)
    print(self.prob_df)

self.prob_model = PandasModel(self.prob_df)

单选按钮方法:

    def freqrad_update(self):
        btn = self.sender()
        if btn.isChecked()==True:
            self.freq_table.setModel(self.freq_model)
            
    def probrad_update(self):
        btn = self.sender()
        if btn.isChecked()==True:
            self.freq_table.setModel(self.prob_model)
python pandas dataframe pyqt5 qtableview
1个回答
0
投票

这与Qt无关,而是与pandas有关。

具体来说,

values
属性,它返回一个numpy表示。 numpy 数组的值必须始终具有相同的类型,并且数据帧的所有值最终将转换为合适的common类型:

注释


dtype 将是一个较低公分母的 dtype(隐式向上转型);也就是说,如果数据类型(即使是数字类型)混合,则将选择能够容纳所有数据类型的数据类型。如果您不处理方块,请小心使用。

在第二个数据框中,您使用混合整数和浮点数,这使得常见数据类型为浮点数(大概是

float64
)。

如果您对值本身感兴趣,则 numpy 转换毫无意义,您可以使用

at
代替,这将返回数据框中的实际值:

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

请注意,项目符号是不同的,因为它不会像数组(“列表的列表”)那样获取项目,而是使用

[row, col]
语法。

另请注意,在函数末尾返回

None
是没有意义的,因为它在 Python 中是隐式的。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.