PyQt5 QTableView指定列数据类型显示异常的原因与解决方法
问题原因与解决方案
核心原因
你遇到的整数显示带.0的问题,本质是Pandas DataFrame的隐式类型转换:
self.freq_df所有列都是整数类型,第一列的dtype为int,转字符串时直接输出整数格式;- 当你复制
freq_df生成prob_df后,修改第2至8列为浮点型,Pandas会为了兼容列间数据类型,将第一列的整数类型自动升级为浮点型。虽然打印prob_df时第一列看起来是整数,但实际存储的是float类型的值(比如3会变成3.0),而你的PandasModel直接将值转为字符串,因此显示为3.0。
解决方案
方案1:强制修正prob_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) # 把第一列转回整数类型 self.prob_df.iloc[:, 0] = self.prob_df.iloc[:, 0].astype(int) print(self.prob_df)
这样第一列的dtype恢复为int,后续转字符串时就不会带.0。
方案2:在表格模型中优化显示逻辑
如果不想修改DataFrame的原始类型,可以在PandasModel的data方法中添加格式判断,自动处理整数型浮点数的显示:
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: value = self._data.values[index.row()][index.column()] # 判定是否为整数形式的浮点数 if isinstance(value, float) and value.is_integer(): return str(int(value)) return str(value) 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
这个方法更灵活,不管DataFrame列的原始类型是什么,只要值是整数形式的浮点数,就会以整数格式显示。
内容的提问来源于stack exchange,提问作者zicari
相关产品推荐
相关产品推荐

