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 DataFrameModel
和DataFrameWidget
请参阅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。
似乎没有简单的解决办法。 所以,下面是一个在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而不是QTableWidget 。 QTableView是基于模型视图编程。
这些小部件如何访问数据有两种不同的方式。 传统方式涉及包含用于存储数据的内部容器的小部件。 这种方法非常直观,但是,在许多不平凡的应用程序中,它会导致数据同步问题。 第二种方法是模型/视图编程,其中小部件不维护内部数据容器
我为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,就会自行清理。