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 而不是 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
【讨论】:
【参考方案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-autoremove
和 pip-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 DataFrameModel
和 DataFrameWidget
的 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 tempfile
、import subprocess
、import 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 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
python: pandas.DataFrame,如何避免keyerror?
Pandas DataFrame 作为函数的参数 - Python
Pandas实战教程 | 统一替换某列中的值 .replace()