diff options
Diffstat (limited to 'examples/external/pandas/dataframe_model.py')
-rw-r--r-- | examples/external/pandas/dataframe_model.py | 82 |
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() |