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

我正在使用Pandas包,它创build一个DataFrame对象,它基本上是一个标记的matrix。 通常我有长string字段的列,或者多列数据框,所以简单的打印命令不能正常工作。 我已经写了一些文本输出function,但它们不是很好。

我真正喜欢的是一个简单的GUI,它可以让我与数据框/matrix/表进行交互。 就像你会在SQL工具中find的一样。 基本上是一个窗口,有一个只读的电子表格,像查看数据。 我可以通过长桌子等来扩大栏目,上下翻页

我怀疑像这样的东西存在,但我必须用错误的词汇Googlesearch。 如果它是pandas的具体情况会很好,但我想我可以使用任何matrix接受工具。 (顺便说一句 – 我在Windows上)

任何指针?

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

我使用PyQt中的QTableWidget来显示一个DataFrame 。 我创build一个QTableWidgetObject ,然后填充与DataFrame值创build的QTableWidgetObject 。 以下是读取CSV文件的代码片段,创build一个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)))) 

我对其他一些graphics用户界面并不完全满意,所以我创build了自己的,现在我正在Github上维护。 例:

在这里输入图像说明

除了基本的表格+绘图function,我想有一个特定的方式来过滤数据:

  • select一个列从combobox中过滤
  • 编写一个“下划线expression式”来使用任意的Python代码对该列进行过滤。 例如: _ > 0仅对(_ >= date(2016, 1, 1)) & (_ <= date(2016, 1, 31))进行正数值过滤,或对(_ >= date(2016, 1, 1)) & (_ <= date(2016, 1, 31))更复杂的expression式(_ >= date(2016, 1, 1)) & (_ <= date(2016, 1, 31))例如(_ >= date(2016, 1, 1)) & (_ <= date(2016, 1, 31))

您可以使用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, }); 

pandas0.13提供了一个实验性的function:

PySide支持qtpandas DataFrameModelDataFrameWidget

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

您可以使用添加此function

 from pandas.sandbox.qtpandas import DataFrameModel, DataFrameWidget 

问题是在2012年发布,其他答案可能太旧,以至于无法应用。

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

在这里输入图像说明

在这里输入图像说明

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

在这里输入图像说明

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

我发现最好的解决scheme是使用qgrid (请参阅这里 ,也在pandas文档中提到)。 你可以通过安装

 pip install qgrid 

然后你需要在你的IPython笔记本上进一步安装(只是一次)

 qgrid.nbinstall() 

之后,就像带上你的pandas和跑步一样简单

 qgrid.show_grid(df) 

另一个nbviewer是它也在nbviewer呈现。 在这里看到它的行动

我一直在PyQt的graphics用户界面的pandasDataFrame你可能会发现有用的。 它包括复制,过滤和sorting。

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

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

我使用ipython笔记本驱动pandas – 笔记本提供了一个很好的清洁的方式,逐步构build和与pandas数据结构,包括数据框的HTML格式显示交互: http : //ipython.org/notebook.html

有python2.7和python3 pandastable tkintertable 。

我本人不是pandas的使用者,但是快速search“pandasgui” 就能看到Pandas项目的GSOC 2012提案 :

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

所以,没有GUI,但是如果你使用Qt或者Tk写一个,那么这个项目可能会对你的代码感兴趣。

你可以使用GitHub Atom和Hydrogen插件。 在Mac中,您可以使用Cmd + Shift键逐行执行。 即使你只能selectvariables,看到里面。 数据框很好地显示,你甚至可以复制。 我写了一个博客来展示如何configuration这些。 http://ojitha.blogspot.com.au/2016/08/atom-as-spark-editor.html

我强烈build议你使用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

在这里输入图像说明

我在这里testing了很多的build议,没有一个似乎很容易运行或安装,特别是对于Python 3,但现在我已经写了一个基本上完成我想要的function。 需要有这些dataframe全屏,有时可以滚动。

因此,在使用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的replace语法{}".format打开的文件是只读的,在任何情况下它们都是后来被删除的文件,所以它实际上是一个数据框的GUI,它会产生多个Libreoffice Calc为您提供的每个数据框计算,您可以在单独的屏幕上全屏查看,然后一旦closuresCalc,就会自行清理。