【问题标题】:Python / Pandas - GUI for viewing a DataFrame or Matrix [closed]Python / Pandas - 用于查看 DataFrame 或 Matrix 的 GUI [关闭]
【发布时间】: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 解决方案:stackoverflow.com/questions/40554839/…

标签: python user-interface pandas dataframe


【解决方案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 中查看数据框。

          1. 正如其他人所指出的,Python IDE,例如 Spyder 附带数据框查看器。
          2. 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 将其与未使用的依赖项一起删除(如 stackoverflow.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
                  

                  【讨论】:

                  【解决方案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 编写一个,该项目可能会对您的代码感兴趣。

                    【讨论】:

                    • 谢谢,但我认为构建一个普遍可用的工具将超出我的技能水平!
                    猜你喜欢
                    • 1970-01-01
                    • 2012-06-04
                    • 2020-10-10
                    • 2020-06-14
                    • 1970-01-01
                    • 2016-09-02
                    • 2021-07-12
                    • 2011-06-04
                    • 2019-09-18
                    相关资源
                    最近更新 更多