-
Notifications
You must be signed in to change notification settings - Fork 0
/
PandasModelClass.py
84 lines (63 loc) · 2.53 KB
/
PandasModelClass.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import pandas as pd
from PyQt5.QtWidgets import QTableView, QApplication
from PyQt5.QtCore import QAbstractTableModel, Qt, QModelIndex
import sys
class PandasModel(QAbstractTableModel):
"""A model to interface a Qt view with pandas dataframe """
def __init__(self, dataframe: pd.DataFrame, parent=None):
QAbstractTableModel.__init__(self, parent)
if type(dataframe) == type(pd.DataFrame()):
self._dataframe = dataframe
else:
try:
self._dataframe = pd.DataFrame(dataframe)
except:
raise Exception("IJS: Need to pass a DataFrame not {}".format(type(dataframe)))
def rowCount(self, parent=QModelIndex()) -> int:
""" Override method from QAbstractTableModel
Return row count of the pandas DataFrame
"""
if parent == QModelIndex():
return len(self._dataframe)
return 0
def columnCount(self, parent=QModelIndex()) -> int:
"""Override method from QAbstractTableModel
Return column count of the pandas DataFrame
"""
if parent == QModelIndex():
return len(self._dataframe.columns)
return 0
def data(self, index: QModelIndex, role=Qt.ItemDataRole):
"""Override method from QAbstractTableModel
Return data cell from the pandas DataFrame
"""
if not index.isValid():
return None
if role == Qt.DisplayRole:
return str(self._dataframe.iloc[index.row(), index.column()])
return None
def headerData(
self, section: int, orientation: Qt.Orientation, role: Qt.ItemDataRole
):
"""Override method from QAbstractTableModel
Return dataframe index as vertical header data and columns as horizontal header data.
"""
if role == Qt.DisplayRole:
if orientation == Qt.Horizontal:
return str(self._dataframe.columns[section])
if orientation == Qt.Vertical:
return str(self._dataframe.index[section])
return None
if __name__ == "__main__":
app = QApplication(sys.argv)
view = QTableView()
view.resize(800, 500)
view.horizontalHeader().setStretchLastSection(True)
view.setAlternatingRowColors(True)
view.setSelectionBehavior(QTableView.SelectRows)
model = PandasModel(pd.get_dummies(pd.Series(list('abcaa'))))
view.setModel(model)
view.show()
app.exec()