(注:这是我在这里发表的第一篇文章,我认为自己是 Python 的“行家”)
问题总结:
我有一个 PyQt5 QTableView,通过抽象表模型由 pandas 数据框填充
单选按钮组允许用户在两个数据帧之间切换表格
两个数据帧均确认第 1 列为整数,但表格视图仅针对还包含其他浮点数的数据帧显示带有“.0”的数字。
我想知道为什么会发生这种情况以及如何解决它。
第一个数据帧包含所有整数,但第二个数据帧仅在第 1 列(第一个非索引列)中包含整数
第一列对于两个表来说是相同的,正如打印数据帧内容所确认的那样
数据帧 self.freq_df
...
数据帧 self.prob_df
...
概率表内容截图
概率表内容截图
以下是我希望的相关代码片段:
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)
这与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 中是隐式的。