Python / Pandas - 用于查看 DataFrame 或 Matrix 的 GUI [关闭]

Posted

技术标签:

【中文标题】Python / Pandas - 用于查看 DataFrame 或 Matrix 的 GUI [关闭]【英文标题】:Python / Pandas - GUI for viewing a DataFrame or Matrix [closed] 【发布时间】:2012-05-25 01:08:50 【问题描述】:

我正在使用 Pandas 包,它创建了一个 DataFrame 对象,它基本上是一个带标签的矩阵。通常我的列有很长的字符串字段,或者有很多列的数据框,所以简单的打印命令不能很好地工作。我写了一些文本输出函数,但都不是很好。

我真正喜欢的是一个简单的 GUI,它可以让我与数据框/矩阵/表格进行交互。就像您在 SQL 工具中找到的一样。基本上是一个具有只读电子表格的窗口,例如查看数据。我可以通过长表扩展列、上下翻页等。

我怀疑存在这样的事情,但我一定是用错误的术语进行谷歌搜索。如果它是熊猫专用的,那就太好了,但我想我可以使用任何矩阵接受工具。 (顺便说一句 - 我在 Windows 上。)

任何指针?

或者,相反,如果有人很了解这个空间并且知道这可能不存在,是否有一个简单的 GUI 框架/小部件我可以用来推出我自己的任何建议? (但由于我的需求有限,我不愿意学习一个大的 GUI 框架并为此编写一堆代码。)

【问题讨论】:

Pyspread 有什么帮助吗? 看起来对我的需要有点过分了,但如果没有更简单的方法,我会研究一下。谢谢。 这可以在 spyder(code.google.com/p/spyderlib) 中完成吗?我一直在将 Rstudio 与 R 一起使用,我喜欢只需单击一下即可查看数据。我完全同意 Python/Pandas 缺少类似的工具,而 iPython 很棒,但在这个领域没有。 我发现 ipython notebook 很适合这个。 如果您想在新的浏览器窗口中查看完整的数据框,而不是在有限的输出单元格中,您可以从这里使用简单的 python+javascript 解决方案:***.com/questions/40554839/… 【参考方案1】:

一种非常简单的方法是使用xlwings 在 Excel 中查看数据框。它对 Pandas 数据帧有很好的处理。使用照常安装

pip install xlwings

然后在您工作时打开 Excel,然后

import xlwings as xw
xw.sheets.active.range("A1").value = df         # put df in currently active sheet

更复杂的是,您可以使用 app = xw.App() 打开 Excel 和/或 xw.Book() 从 Excel 创建新工作簿。要在工作表之间创建/切换,我通常使用一个小的自定义函数

def addActivate(wb, sheet, after=None, before=None):
    try:
        wb.sheets.add(sheet, after=after, before=before)
    except ValueError:
        wb.sheets(sheet).activate()

addActivate(xw.books.active, "newSheet")
xw.sheets.active.range("A1").value = df

【讨论】:

【参考方案2】:

我也一直在寻找非常简单的 gui。我很惊讶没有人提到gtabview

它很容易安装(只是pip3 install gtabview),而且它加载数据的速度非常快。 如果您不使用 spyder 或 Pycharm,我建议使用 gtabview。

【讨论】:

【参考方案3】:

你也可以使用 pandastable 库

https://github.com/dmnfarrell/pandastable

我发现它对我的应用程序非常有用

你可以简单地使用“pip install pandastable”安装pandastable

我的应用程序可以在 pandas==0.23.4 上运行,而这个版本的 pandas 可以很好地与 pandastable 配合使用

【讨论】:

【参考方案4】:

我可以提议pivotablejs吗?

它在 Jupyter 笔记本中的几行中提供了水平和垂直旋转、过滤、图形、排序和许多不同的聚合(提示:右键单击 [弹出] 链接并在新选项卡中打开增加灵活性)

!pip install pivottablejs
from pivottablejs import pivot_ui

pivot_ui(df, outfile_path='pivottablejs.html')

https://towardsdatascience.com/two-essential-pandas-add-ons-499c1c9b65de

【讨论】:

【参考方案5】:

2019 年更新:我目前正在开发继任者 tabloo。


我对其他一些 GUI 并不完全满意,所以我创建了自己的 GUI,我现在正在维护 on Github。示例:

除了基本的表格+绘图功能外,我还想有一种特定的方式来过滤数据:

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

【讨论】:

Gui 显示数字 - 它显示空列而不是数字。 @javed:您能否使用Github issue tracker 并澄清您的意思? 我用的是python 2.7,安装你的包和依赖好像有点麻烦,我需要python 3.x环境来安装你的包吗? @cloudscomputes 它是在 Python 2.7 下/为 Python 2.7 开发的,所以这应该不是问题。但与上述相同的评论:这不是提供支持的正确地方。请使用GitHub issue tracker。【参考方案6】:

我使用 PyQt 中的 QTableWidget 来显示 DataFrame。我创建了一个QTableWidgetObject,然后填充了使用DataFrame 值创建的QTableWidgetItems。 以下是读取 CSV 文件的代码 sn-p,创建 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 中查看数据框。

    正如其他人所指出的,Python IDE,例如 Spyder 附带数据框查看器。 qgrid 是 jupyter notebook 小部件的另一个选项,它在 notebook 中呈现数据帧。

如果有人仍然想编写一个简单的 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()

【讨论】:

sn-p 中的self 是什么? 指扩展QWidget或QMainWindow等用户界面类的类的对象【参考方案7】:

可以使用dataframe的to_clipboard()方法快速复制,然后将dataframe粘贴到电子表格中:

df.to_clipboard()

【讨论】:

一旦我运行这个命令,我的内核就崩溃了【参考方案8】:

我在这里测试了许多建议,但它们似乎都不能轻松运行或安装,尤其是对于 Python 3,但现在我已经编写了一个基本上可以完成我想要的功能的函数。需要让这些数据帧全屏显示,并且有时可以滚动。

因此,在使用 Libreoffice Calc 的 Linux 环境中,受来自 Unix 和 Linux StackExchange 的 this answer 的启发,您可以在 Python 3 中执行以下操作:

import pandas as pd
import os

def viewDF(*dfs):
    filelist = ""
    for c, df in enumerate(dfs):    
        filename = 'tmp_df' + str(c) + '.csv'
        odsfile = 'tmp_df' + str(c) + '.ods'
        df.to_csv(filename)
        os.system("soffice --headless --convert-to ods  ".format(filename))     
        filelist += odsfile + " "
    os.system("soffice --view ".format(filelist)) 
    os.system("rm ".format('tmp_df*'))

像这样使用它:

viewDF(df1, df2, df3)

我在那里学到了一些东西,那就是 Python 3 替换语法".format 打开的文件是只读的,无论如何它们都是后来被删除的文件,因此它实际上是数据帧的 GUI。它将为您提供的每个数据框生成多个 Libreoffice Calc 实例,您可以在单独的屏幕上全屏查看,然后关闭 Calc 后,它会自行清理。

【讨论】:

在测试了许多答案后,我惊讶地发现这是最好的解决方案。我稍微修改了一下:ending = time.strftime('%Y%m%d%H%M%S')filename = f'tmp_df_ending%s'df.to_csv(filename%'csv')os.system(f"soffice --headless --convert-to ods filename%'csv'")os.system(f"soffice --view filename%'ods'")【参考方案9】:

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

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

我为 pandas 数据框 编写了一个模型。

# -*- 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

【讨论】:

【参考方案10】:

您可以将 GitHub Atom 与 Hydrogen 插件一起使用。在 Mac 中,您可以使用 Cmd+Shift 键逐行执行。即使您只能选择变量并查看内部。数据帧很好地显示,你甚至可以复制。我写了一篇博客来展示配置这些的方法。 http://ojitha.blogspot.com.au/2016/08/atom-as-spark-editor.html

【讨论】:

【参考方案11】:

该问题于 2012 年发布,其他答案可能太旧而无法应用。

2016 年的答案是,我们应该使用 Pycharm,它附带 DataFrame 查看器。

【讨论】:

不使用debug模式的情况如何? 不使用调试模式时不起作用。但是在spyder中我们可以不用调试模式查看。 @uday 您仍然可以在没有调试模式的情况下浏览数据框。我可以确认 Pycharm 拥有最快、最流畅的数据框 gui,尽管它并非没有问题。 理想情况下,python 用户不必为了查看某些数据帧内容而更改 IDE。【参考方案12】:

除了所有有价值的答案,我想提一下 Spyder IDE (https://github.com/spyder-ide) 具有此功能,您可以在下面的打印屏幕中看到:

这只是一个客观事实,并不是任何 IDE 的广告 :) 我不想引发关于这个问题的任何辩论。

【讨论】:

【参考方案13】:

我发现最好的解决方案是使用qgrid(请参阅here,在pandas docs 中也提到过)。您可以通过安装

pip install qgrid

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

qgrid.nbinstall()

之后,就像带上你的 pandas df 并运行一样简单

qgrid.show_grid(df)

另一个好处是它也可以在nbviewer 中呈现。亲身体验here

【讨论】:

我安装了qgrid,发现它也安装了大量的依赖。对于删除,我必须使用 pip-autoremove 实用程序 pip install pip-autoremovepip-autoremove qgrid -y 将其与未使用的依赖项一起删除(如 ***.com/questions/7915998/… 所述)。【参考方案14】:

我一直在为 pandas DataFrame 开发一个 PyQt GUI,您可能会觉得这很有用。它包括复制、过滤和排序。

https://gist.github.com/jsexauer/f2bb0cc876828b54f2ed

【讨论】:

【参考方案15】:

tkintertable 用于 python2.7,pandastable 用于 python3。

【讨论】:

pandastable 很棒,应该是公认的答案。【参考方案16】:

Pandas 0.13 作为实验性功能提供:

对 qtpandas DataFrameModelDataFrameWidget 的 PySide 支持

见https://github.com/pydata/pandas/blob/master/doc/source/faq.rst

您可以使用添加此功能

from pandas.sandbox.qtpandas import DataFrameModel, DataFrameWidget

【讨论】:

谢谢你! Pandas 文档中现在有一个工作示例:pandas.pydata.org/pandas-docs/dev/…【参考方案17】:

您可以使用 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 www.datatables.net 的 datatables 插件。这是我用来显示 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,
);

【讨论】:

【参考方案18】:

我使用 ipython notebook 来驱动 pandas —— notebook 提供了一种非常简洁的方式来增量构建和与 pandas 数据结构交互,包括数据帧的 HTML 化显示:http://ipython.org/notebook.html

【讨论】:

该链接不指向任何解决方案,仅指向 iPython(现为 Jupyter)主页。 “数据帧的 HTML 化显示”在哪里?这是this answer 中描述的内容,还是只是some_df.head (n) 的单元格输出? 遇到这个的人可能需要:Pretty-print an entire Pandas Series / DataFrame【参考方案19】:

似乎没有简单的解决方案。因此,下面是一个在 Excel 中打开数据框的小功能。这可能不是生产质量代码,但它对我有用!

def open_in_excel(df, index=True, excel_path="excel.exe", tmp_path='.'):
    """Open dataframe df in excel.

    excel_path - path to your copy of excel
    index=True - export the index of the dataframe as the first columns
    tmp_path    - directory to save the file in


    This creates a temporary file name, exports the dataframe to a csv of that file name,
    and then tells excel to open the file (in read only mode). (It uses df.to_csv instead
    of to_excel because if you don't have excel, you still get the csv.)

    Note - this does NOT delete the file when you exit. 
    """

    f=tempfile.NamedTemporaryFile(delete=False, dir=tmp_path, suffix='.csv', prefix='tmp_')
    tmp_name=f.name
    f.close()

    df.to_csv(tmp_name, index=index)
    cmd=[excel_path, '/r', '/e', tmp_name]
    try:
        ret_val=subprocess.Popen(cmd).pid
    except:
        print "open_in_excel(): failed to open excel"
        print "filename = ", tmp_name
        print "command line = ", cmd
        print "Unexpected error:", sys.exc_info()[0]

    return

【讨论】:

太棒了,效果很好!为了让它在 Python 3 中工作:import tempfileimport subprocessimport sys,将excel.exe 的路径更新为C:\Program Files\Microsoft Office\Office16\Excel.exe 之类的东西(取决于系统)。 print 语句需要用括号括起来以使它们与 Python 3 兼容。也可以在 pip install xlwt 之后使用 .to_excel,它写入临时文件的 .xls 而不是 .csv【参考方案20】:

我自己不是 Pandas 用户,但快速搜索“pandas gui”会出现 Pandas 项目的GSOC 2012 proposal:

目前与这些对象交互的唯一方法是通过 API。该项目建议添加一个简单的 Qt 或 Tk GUI 来查看和操作这些对象。

因此,没有 GUI,但如果您使用 Qt 或 Tk 编写一个,该项目可能会对您的代码感兴趣。

【讨论】:

谢谢,但我认为构建一个普遍可用的工具将超出我的技能水平!

以上是关于Python / Pandas - 用于查看 DataFrame 或 Matrix 的 GUI [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Pandas数据结构和基本功能

python: pandas.DataFrame,如何避免keyerror?

Pandas DataFrame 作为函数的参数 - Python

Pandas实战教程 | 统一替换某列中的值 .replace()

Python pandas groupby 方法无法正常工作

Python Pandas:将嵌套字典转换为数据框