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

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

我真正喜欢的是一个简单的 GUI,它可以让我与数据框架/矩阵/表交互。就像 SQL 工具一样。基本上是一个具有只读电子表格之类的数据视图的窗口。我可以展开列,在长表中上下翻页,等等。

我怀疑这样的东西是存在的,但是我一定是在谷歌上搜错了词。如果是专门针对熊猫的,那就太好了,但我想我可以使用任何矩阵接受工具。(顺便说一句,我在 Windows 上。)

有什么建议吗?

或者,相反地,如果有人很了解这个空间,并且知道它可能不存在,那么有没有什么建议可以让我自己使用一个简单的 GUI 框架/小部件呢?(但是由于我的需求是有限的,所以我不愿意学习一个大的 GUI 框架并为这一部分做大量的编码工作。)

105212 次浏览

我自己不是一个熊猫用户,但是快速搜索“熊猫归”就会出现熊猫项目的 GSOC 2012年提案:

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

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

似乎没有简单的解决办法。因此,下面是一个在 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

我使用 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. 正如其他人指出的,像 Spyder 这样的 Python IDE 带有数据帧查看器。
  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()

enter image description here

我使用 ipython 笔记本电脑来驱动熊猫——笔记本电脑提供了一种非常简洁的方式来增量构建和交互熊猫数据结构,包括 HTML 化的数据框架显示: http://ipython.org/notebook.html

您可以使用 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的数据表插件。下面是我用来显示在 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,
});

熊猫0.13提供了一个实验特性:

PySide 对 qtPandas DataFrameModelDataFrameWidget的支持

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

您可以使用

from pandas.sandbox.qtpandas import DataFrameModel, DataFrameWidget

Python2.7有 TKIntertable python3有 熊猫座

我一直在为熊猫 DataFrame 开发一个 PyQt GUI,您可能会发现它很有用。它包括复制、筛选和排序。

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

我找到的最好的解决方案是使用 qgrid(参见 给你,也在 熊猫医生中提到)

pip install qgrid

然后你需要做一个进一步的安装(只有一次)在您的 IPython笔记本电脑

qgrid.nbinstall()

之后,它就像带着你的 pandas df跑步一样简单

qgrid.show_grid(df)

另一个好的事情是,它在 nbviewer渲染也。看到它在行动 给你

2019年更新: 我目前正在制作一个后续的 禁忌


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

enter image description here

除了基本的表 + 图功能之外,我还想有一种特殊的方法来过滤数据:

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

除了所有有价值的答案之外,我想提一下 Spyder IDE (https://github.com/spyder-ide)有这个特性,你可以在我的打印屏幕下面看到:

enter image description here

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

这个问题是在2012年发布的,其他的答案可能太老了,不适用。

2016年的答案是,我们应该使用 Pycharm,并且它与 DataFrame查看器一起发布。

enter image description here

enter image description here

你可以使用带有氢插件的 GitHub Atom。在 Mac 中,您可以使用 Cmd + Shift 键逐行执行。即使你只能选择变量,并看到里面。DataFrames 显示效果很好,甚至可以进行复制。我写了一个博客来展示如何配置这些。 Http://ojitha.blogspot.com.au/2016/08/atom-as-spark-editor.html

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

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

我为 熊猫数据框架写了一个模型。

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

我在这里测试了许多建议,它们似乎都不容易运行或安装,特别是对于 Python 3,但是现在我已经编写了一个基本上实现了我想要的功能的函数。需要有这些数据框架全屏幕,有时可滚动。

因此,在使用 Libreoffice Calc 的 Linux 环境中,受 Unix 和 Linux StackExchange 的 这个答案的启发,下面是您在 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,它就会自己清理。

可以使用 dataframe 的 to _ clipboard ()方法快速复制数据,然后将数据框粘贴到电子表格中:

df.to_clipboard()

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

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

我能提议 pivotablejs吗?

它提供水平和垂直的旋转,过滤,图形,排序,以及许多不同的聚合,所有这些都在一个 Jupiter 笔记本的几行中(提示: 右键单击[弹出]链接,并在一个新的标签页中打开,以增加灵活性)

!pip install pivottablejs
from pivottablejs import pivot_ui


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

Graphic pivoting example

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

一个非常简单的方法是使用 飞机在 Excel 中查看数据帧。它有很好的处理熊猫数据框架。像往常一样使用

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

你也可以使用熊猫图书馆

Https://github.com/dmnfarrell/pandastable

我发现它对我的申请很有用

你可以简单地使用‘ pip install panastable’安装 panastable

我的应用程序可以在熊猫上运行 = = 0.23.4,而这个版本的熊猫可以很好的运行在 Pandastable 上