aboutsummaryrefslogtreecommitdiffstats
path: root/examples/external/pandas/dataframe_model.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/external/pandas/dataframe_model.py')
-rw-r--r--examples/external/pandas/dataframe_model.py82
1 files changed, 82 insertions, 0 deletions
diff --git a/examples/external/pandas/dataframe_model.py b/examples/external/pandas/dataframe_model.py
new file mode 100644
index 000000000..b3d9e81fe
--- /dev/null
+++ b/examples/external/pandas/dataframe_model.py
@@ -0,0 +1,82 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import pandas as pd
+
+from PySide6.QtWidgets import QTableView, QApplication
+from PySide6.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)
+ self._dataframe = 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)
+
+ df = pd.read_csv("iris.csv")
+
+ view = QTableView()
+ view.resize(800, 500)
+ view.horizontalHeader().setStretchLastSection(True)
+ view.setAlternatingRowColors(True)
+ view.setSelectionBehavior(QTableView.SelectRows)
+
+ model = PandasModel(df)
+ view.setModel(model)
+ view.show()
+ app.exec()