pyqt, 将dataframe数据导入tableview中,要求能对其多列进行筛选,筛选出满足条件的行,要求能进行文本筛选或数学筛选,提供代码示例
时间: 2023-11-22 15:04:54 浏览: 266
Python Pandas中Dataframe对象,如何根据列值筛选满足条件的行,并且获得行的索引值
下面是一个示例代码,它展示了如何使用PyQt和pandas将数据框(DataFrame)导入到QTableView中,并允许用户对多个列进行筛选。示例中使用了两个LineEdit控件,一个用于文本筛选,另一个用于数学筛选。
```python
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QWidget, QHBoxLayout, QVBoxLayout, QLineEdit
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel, QStandardItem
import pandas as pd
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 创建一个表格视图
self.table_view = QTableView()
# 创建两个LineEdit控件,用于筛选
self.text_filter = QLineEdit()
self.text_filter.setPlaceholderText("文本筛选")
self.text_filter.textChanged.connect(self.apply_filter)
self.number_filter = QLineEdit()
self.number_filter.setPlaceholderText("数值筛选")
self.number_filter.textChanged.connect(self.apply_filter)
# 将LineEdit控件放入水平布局中
filter_layout = QHBoxLayout()
filter_layout.addWidget(self.text_filter)
filter_layout.addWidget(self.number_filter)
# 将表格视图和水平布局放入垂直布局中
main_layout = QVBoxLayout()
main_layout.addWidget(self.table_view)
main_layout.addLayout(filter_layout)
# 创建一个QWidget,并将垂直布局放入其中
central_widget = QWidget()
central_widget.setLayout(main_layout)
self.setCentralWidget(central_widget)
# 加载数据
self.load_data()
def load_data(self):
# 使用pandas从csv文件中读取数据,并创建一个QStandardItemModel
df = pd.read_csv("data.csv")
model = QStandardItemModel(df.shape[0], df.shape[1])
model.setHorizontalHeaderLabels(df.columns)
# 将数据框中的值添加到QStandardItemModel中
for i in range(df.shape[0]):
for j in range(df.shape[1]):
item = QStandardItem(str(df.iloc[i, j]))
model.setItem(i, j, item)
# 将QStandardItemModel设置为表格视图的模型
self.table_view.setModel(model)
def apply_filter(self):
# 获取文本筛选和数值筛选的值
text_filter = self.text_filter.text()
number_filter = self.number_filter.text()
# 获取表格视图的模型
model = self.table_view.model()
# 遍历表格视图的每一行,根据筛选条件设置行的可见性
for row in range(model.rowCount()):
text_match = False
number_match = False
# 如果文本筛选框不为空,则只显示包含文本筛选框中文本的行
if text_filter:
for column in range(model.columnCount()):
if text_filter in model.data(model.index(row, column), Qt.DisplayRole):
text_match = True
break
else:
text_match = False
# 如果数值筛选框不为空,则只显示符合数值筛选框条件的行
if number_filter:
for column in range(model.columnCount()):
try:
value = float(model.data(model.index(row, column), Qt.DisplayRole))
if eval(f"{value} {number_filter}"):
number_match = True
break
except:
pass
else:
number_match = False
# 设置行的可见性
if text_match or number_match:
self.table_view.setRowHidden(row, False)
else:
self.table_view.setRowHidden(row, True)
if __name__ == "__main__":
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
```
在这个示例中,我们首先创建一个QTableView和两个QLineEdit控件。我们使用pandas从csv文件中读取数据,并将其添加到QStandardItemModel中。然后我们将QStandardItemModel设置为表格视图的模型。为了允许用户对多列进行筛选,我们使用了两个LineEdit控件,一个用于文本筛选,另一个用于数学筛选。当用户在任一筛选框中输入文本时,我们遍历表格视图的每一行,根据筛选条件设置行的可见性。最后,我们将QVBoxLayout设置为主窗口的布局,并将表格视图和LineEdit控件添加到其中。
阅读全文