Python / Pandas - 用于查看DataFrame或矩阵的GUI

73
我正在使用Pandas包,它创建了一个DataFrame对象,基本上是一个带标签的矩阵。通常我的列具有长字符串字段,或者数据框有许多列,所以简单的print命令不起作用。我已经编写了一些文本输出函数,但它们并不好用。
我真正想要的是一个简单的GUI,可以让我与数据框/矩阵/表进行交互。就像在SQL工具中一样。基本上是一个窗口,其中包含对数据的只读电子表格视图。我可以展开列,在长表格中上下翻页等等。
我会怀疑这样的东西存在,但我肯定是使用错误的术语进行谷歌搜索。如果它是pandas特定的那就太好了,但我猜我可以使用任何矩阵接受工具。(顺便说一句-我正在使用Windows系统)
有任何建议吗?
或者,相反地,如果有人对这个领域很了解,知道这个东西可能不存在,是否有任何建议,如果有一个简单的GUI框架/部件,我可以使用它来自己制作?(但由于我的需求有限,我不愿意为这一个部分学习大型GUI框架并进行大量编码)

2
Pyspread 会有任何帮助吗? - Maria Zverina
看起来对我的需求有些过度,但如果没有更简单的方法,我会研究一下它。谢谢。 - Ross R
2
这个能在Spyder(http://code.google.com/p/spyderlib/)中完成吗?我一直在使用Rstudio和R,我喜欢能够通过单击查看数据。我完全同意Python / Pandas的可比工具缺失,iPython很棒,但在这个领域不是最好的选择。 - zach
(2020年)。有[D-tale](http://alphatechadmin.pythonanywhere.com/dtale/main/1)。对于Jupyter,[这篇文章](https://towardsdatascience.com/two-essential-pandas-add-ons-499c1c9b65de)介绍了两个强大的插件:[qgrid](https://github.com/quantopian/qgrid)和[pivottablejs](https://github.com/nicolaskruchten/jupyter_pivottablejs)。 - mins
你可以使用Pandas GUI。我的回答可能会有所帮助:https://stackoverflow.com/a/65283412/5114585 - Dr Nisha Arora
显示剩余3条评论
20个回答

58

2019年更新: 我目前正在开发一个后继者 tabloo


由于一些其他的GUI界面不能完全满足我的需求,因此我创造了自己的GUI界面,并在Github上进行维护。 示例:

enter image description here

除了基本的表格和图形功能外,我希望有一种特定的方式来过滤数据:

  • 从组合框中选择要过滤的列
  • 编写一个“下划线表达式”以使用任意Python代码过滤该列。例如:_ > 0 只过滤正值,或者更复杂的表达式,如 (_ >= date(2016, 1, 1)) & (_ <= date(2016, 1, 31)) ,例如针对日期时间列。

GUI正在显示数字-它显示空列而不是数字。 - Javed
@javed:你能否使用Github问题跟踪器并澄清你的意思? - bluenote10
我正在使用Python 2.7,似乎在安装您的软件包及其依赖项时出现了一些问题,我需要一个Python 3.x环境来安装您的软件包吗? - cloudscomputes
@cloudscomputes 它是在/为 Python 2.7 下开发的,所以这不应该是问题。但与上面的评论相同:这不是提供支持的正确位置。请使用 GitHub 问题跟踪器 - bluenote10

25

我使用 PyQt 中的 QTableWidget 来展示一个 DataFrame。我创建了一个 QTableWidgetObject,然后使用 DataFrame 的值来创建 QTableWidgetItems 填充表格。 以下是读取 CSV 文件创建 DataFrame 并在 GUI 中展示的代码片段:

df  = read_csv(filename, index_col = 0,header = 0)
self.datatable = QtGui.QTableWidget(parent=self)
self.datatable.setColumnCount(len(df.columns))
self.datatable.setRowCount(len(df.index))
for i in range(len(df.index)):
    for j in range(len(df.columns)):
        self.datatable.setItem(i,j,QtGui.QTableWidgetItem(str(df.iget_value(i, j))))

更新:

由于这个答案已经很旧了,它需要更新。现在有许多选项可用于在 GUI 中查看数据框。

  1. 正如其他人指出的那样,Python IDE(例如 Spyder)带有数据框查看器。
  2. qgrid 是另一种选项,可用于 Jupyter 笔记本小部件,该小部件在笔记本中呈现数据框。

如果有人仍然想编写一个简单的 GUI 在 Jupyter 中查看数据框,则以下是使用 Pyqt5 的完整、最小示例。

%gui qt5 
from PyQt5.QtWidgets import QWidget,QScrollArea, QTableWidget, QVBoxLayout,QTableWidgetItem
import pandas as pd

win = QWidget()
scroll = QScrollArea()
layout = QVBoxLayout()
table = QTableWidget()
scroll.setWidget(table)
layout.addWidget(table)
win.setLayout(layout)    


df = pd.DataFrame({"a" : [4 ,5, 6],"b" : [7, 8, 9],"c" : [10, 11, 12]},index = [1, 2, 3])
table.setColumnCount(len(df.columns))
table.setRowCount(len(df.index))
for i in range(len(df.index)):
    for j in range(len(df.columns)):
        table.setItem(i,j,QTableWidgetItem(str(df.iloc[i, j])))

win.show()

输入图像描述


在这段代码中,self 是什么? - doraemon
它指的是扩展用户界面类(如QWidget或QMainWindow)的类的对象。 - Siva-Sg

19

这个问题是在2012年发布的,其他答案可能太过陈旧不再适用。

2016年的答案是,我们应该使用Pycharm,并且它自带了DataFrame查看器DataFrame viewer。

输入图片说明

输入图片说明


3
如果没有使用调试模式,怎么办? - uday
不使用调试模式时无法工作。但在Spyder中,我们可以在不使用调试模式的情况下查看。 - GeorgeOfTheRF
@uday 在不调试模式下仍然可以浏览数据框。我可以确认Pycharm拥有最快速和流畅的数据框GUI,尽管它并非没有问题。 - Matthew Son
1
理想情况下,Python用户不应该因为查看一些数据框内容而不得不更改IDE。 - Niko Pasanen

12

谢谢您!现在 Pandas 文档中有一个可用的示例:http://pandas.pydata.org/pandas-docs/dev/faq.html#visualizing-data-in-qt-applications - fantabolous

10
除了所有有价值的答案外,我想提到Spyder IDE(https://github.com/spyder-ide)也具有此功能,如下面的截图所示:

enter image description here

这只是一个客观的事实,而不是任何IDE的广告:) 我不想在这个问题上引发任何争论。

8
数据框的to_clipboard()方法可以快速复制,然后将数据框粘贴到电子表格中。
df.to_clipboard()

一旦我运行了这个命令,我的内核就崩溃了。 - cloudscomputes
请注意,您的解决方案在云端环境(如GoogleColab ref1 ref2)中无法使用,因此像Pyperclip模块这样的可复制粘贴的解决方案只适用于非虚拟机本地机器来重现数据。 - Mario

8
您可以使用to_html()数据框方法将数据框转换为HTML并在浏览器中显示它。这是一个示例,假设您有一个名为df的数据框。您应该查看文档以了解to_html()方法中可用的其他选项。
# Format floating point numbers with 2 decimal places.
data_table = df.to_html(float_format=lambda x: '%6.2f' % x,
    classes="table display")
# The to_html() method forces a html table border of 1 pixel.
# I use 0  in my table so I  change the html, since there is no 
# border argument in the to_html() method.
data_table = data_table.replace('border="1"','border="0"')
# I alson like to display blanks instead on nan.
data_table = data_table.replace('nan', '')

如果您想要将表格格式化并使其可滚动,则可以使用jQuery的datatables插件www.datatables.net。这是我用来显示在x和y方向上都可以滚动的表格的javascript代码。
$('.table').dataTable({
    "bPaginate": true,
    "bLengthChange": true,
    "bSort": false,
    "bStateSave": true,
    "sScrollY": 900,
    "sScrollX": 1000,
    "aLengthMenu": [[50, 100, 250, 500, 1000, -1], [50, 100, 250, 500, 1000, "All"]],
    "iDisplayLength": 100,
});

6

"pandastable" 很棒,应该被接受作为答案。 - Superdooperhero

6

我找到的最好的解决方案是使用qgrid(请参见此处,并在pandas文档中也有提及)。您可以通过以下方式进行安装:

pip install qgrid

然后您需要在IPython笔记本中进行进一步的安装(仅需一次)

qgrid.nbinstall()

接下来,只需要使用您的 pandas df 并运行以下命令:

qgrid.show_grid(df)

另一个好处是它也可以在 nbviewer 上呈现。在这里可以看到它的运作示例 here


4
我安装了qgrid,发现它还会安装大量的依赖项。为了卸载它,我使用了pip-autoremove工具 pip install pip-autoremovepip-autoremove qgrid -y 来删除它及其未使用的依赖项(如 https://dev59.com/umsz5IYBdhLWcg3wbHAw 所述)。 - rnso

3
我强烈建议您使用QTableView而不是QTableWidgetQTableView 基于模型-视图编程。

这些小部件可以访问其数据的两种不同方式。传统方法涉及包括用于存储数据的内部容器的小部件。这种方法非常直观,但在许多非平凡应用中,它会导致数据同步问题。第二种方法是模型/视图编程,在其中小部件不维护内部数据容器。

我为pandas dataframe编写了一个模型。

# -*- coding: utf-8 -*-
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5 import QtGui
import matplotlib.pyplot as plt

class PandasModel(QtCore.QAbstractTableModel):
    """
    Class to populate a table view with a pandas dataframe
    """

    def __init__(self, data, parent=None):
        QtCore.QAbstractTableModel.__init__(self, parent)
        self._data = data

    def rowCount(self, parent=None):
        return len(self._data.values)

    def columnCount(self, parent=None):
        return self._data.columns.size

    def data(self, index, role=QtCore.Qt.DisplayRole):
        if index.isValid():
            if role == QtCore.Qt.DisplayRole:
                if(index.column() != 0):
                    return str('%.2f'%self._data.values[index.row()][index.column()])
                else:
                    return str(self._data.values[index.row()][index.column()])
        return None

    def headerData(self, section, orientation, role):
        if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
            return self._data.columns[section]
        elif orientation == QtCore.Qt.Vertical and role == QtCore.Qt.DisplayRole:
            return str(self._data.index[section])
        return None

    def flags(self, index):
        flags = super(self.__class__,self).flags(index)
        flags |= QtCore.Qt.ItemIsSelectable
        flags |= QtCore.Qt.ItemIsEnabled
        return flags


if __name__=='__main__':
    import pandas as pd
    import numpy as np
    df = pd.DataFrame()
    df['Field1']=np.arange(0,10,.5)
    df['Field2']=np.arange(0,10,.5)
    app = QtWidgets.QApplication([])
    table = QtWidgets.QTableView()
    mymodel = PandasModel(df)
    table.setModel(mymodel)
    table.show()
    app.exec_()

您可以轻松更改模型以根据您的需求编辑或显示元素。有关更多信息,请参阅modelview

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接