# Copyright (C) 2022 The Qt Company Ltd. # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause from __future__ import annotations 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.ItemDataRole.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.ItemDataRole.DisplayRole: if orientation == Qt.Orientation.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()