Python / Pandas – GUI para ver un DataFrame o Matrix

Estoy usando el paquete Pandas y crea un objeto DataFrame, que es básicamente una matriz etiquetada. A menudo tengo columnas que tienen campos de cadenas largas o marcos de datos con muchas columnas, por lo que el simple comando de impresión no funciona bien. He escrito algunas funciones de salida de texto, pero no son grandes.

Lo que realmente me encantaría es una GUI simple que me permite interactuar con un dataframe / matriz / tabla. Al igual que encontrarías en una herramienta SQL. Básicamente, una ventana que tiene una hoja de cálculo de solo lectura como vista en los datos. Puedo expandir columnas, subir y bajar páginas a través de tablas largas, etc.

Yo sospecharía que algo como esto existe, pero debo estar buscando en Google con los términos equivocados. Sería fantástico si fuera específico de pandas, pero supongo que podría usar cualquier herramienta de aceptación de matrices. (Por cierto, estoy en Windows).

Cualquier punteros?

O, a la inversa, si alguien conoce bien este espacio y sabe que probablemente no exista, ¿hay alguna sugerencia sobre si hay un marco / widget de GUI simple que pueda usar para rodar el mío? (Pero como mis necesidades son limitadas, me resisto a tener que aprender un gran marco de GUI y hacer un montón de encoding para esta pieza).

Utilizo QTableWidget de PyQt para mostrar un DataFrame . Creo un objeto QTableWidgetObject y luego lo QTableWidgetItems con QTableWidgetItems creados con valores DataFrame . A continuación se muestra el fragmento de código que lee un archivo CSV, crea un DataFrame y luego lo muestra en una 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)))) 

Actualizar:

Como esta respuesta era bastante antigua, merece una actualización. Hay muchas opciones disponibles ahora para ver los marcos de datos en la GUI.

  1. Como han señalado otros, los IDE de Python, como Spyder, vienen con visores de marcos de datos.
  2. qgrid es otra opción para el widget del cuaderno jupyter que representa los marcos de datos dentro del cuaderno.

Si alguien todavía desea codificar una GUI simple para ver los marcos de datos dentro de Jupyter, a continuación se muestra el ejemplo completo y mínimo de 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() 

introduzca la descripción de la imagen aquí

No estaba completamente satisfecho con algunas otras GUI, así que creé la mía, que ahora mantengo en Github . Ejemplo:

introduzca la descripción de la imagen aquí

Aparte de la funcionalidad básica de tabla + trazado, quería tener una forma específica de filtrar datos:

  • seleccione una columna para filtrar desde un cuadro combinado
  • escriba una “expresión de subrayado” para filtrar en esa columna utilizando un código Python arbitrario. Por ejemplo: _ > 0 para filtrar solo valores positivos, o expresiones más complejas como (_ >= date(2016, 1, 1)) & (_ <= date(2016, 1, 31)) por ejemplo, para columnas de fecha y hora.

La pregunta fue publicada en 2012 y otras respuestas pueden ser demasiado antiguas para aplicar.

La respuesta en 2016 es que deberíamos usar Pycharm y se envía con el visor DataFrame .

introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

Pandas 0.13 proporciona como una característica experimental:

Soporte de PySide para qtpandas DataFrameModel y DataFrameWidget

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

Puedes agregar esta característica usando

 from pandas.sandbox.qtpandas import DataFrameModel, DataFrameWidget 

Podría usar el método de dataframe to_html () para convertir el dataframe a html y mostrarlo en su navegador. Aquí hay un ejemplo, suponiendo que tiene un dataframe llamado df. Debe consultar la documentación para ver qué otras opciones están disponibles en el método 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', '') 

Si desea que la tabla esté bien formateada y desplazable, puede usar el complemento de datos para jQuery http://www.datatables.net . Aquí está el javascript que uso para mostrar una tabla de los desplazamientos en ambas direcciones xey.

 $('.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, }); 

Además de todas las respuestas valiosas, me gustaría mencionar que el IDE de Spyder ( https://github.com/spyder-ide ) tiene esta función, como puede ver en la siguiente pantalla de impresión:

introduzca la descripción de la imagen aquí

Esto es solo un hecho objective y no un anuncio de IDE 🙂 No quiero provocar ningún debate sobre esta pregunta.

La mejor solución que he encontrado es usar qgrid (consulte aquí , y también se menciona en los documentos de pandas ). Se puede instalar por

 pip install qgrid 

y luego necesitas hacer una instalación adicional (solo una vez) en tu notebook IPython

 qgrid.nbinstall() 

Después, es tan fácil como tomar tus pandas df y correr

 qgrid.show_grid(df) 

La otra cosa buena es que también se nbviewer en nbviewer . Véalo en acción aquí.

Hay tkintertable para python2.7 y pandastable para python3.

He estado trabajando en una GUI de PyQt para Pandas DataFrame que podría ser útil. Incluye copiar, filtrar y ordenar.

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

Le recomiendo que use QTableView no QTableWidget . QTableView se basa en la progtwigción de vista de modelo.

Hay 2 formas diferentes en que estos widgets pueden acceder a sus datos. La forma tradicional incluye widgets que incluyen contenedores internos para almacenar datos. Este enfoque es muy intuitivo, sin embargo, en muchas aplicaciones no triviales, conduce a problemas de sincronización de datos. El segundo enfoque es la progtwigción de modelos / vistas, en la que los widgets no mantienen contenedores de datos internos

Escribí un modelo para el dataframe de 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_() 

Puede cambiar fácilmente el modelo para editar o mostrar los elementos de acuerdo con sus necesidades. Para más información consulte modelview.

introduzca la descripción de la imagen aquí

Parece que no hay una solución fácil. Entonces, a continuación hay una pequeña función para abrir un dataframe en Excel. Probablemente no sea un código de calidad de producción, ¡pero funciona para mí!

 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 

Utilizo los portátiles ipython para conducir pandas: los portátiles proporcionan una forma limpia y agradable de construir e interactuar de forma incremental con las estructuras de datos de pandas, incluida la visualización de marcos de datos en HTML: http://ipython.org/notebook.html

He probado muchas de las sugerencias aquí y ninguna de ellas parece ejecutarse o instalarse fácilmente, especialmente para Python 3, pero ahora he escrito una función que básicamente cumple con lo que quería. Es necesario tener estos marcos de datos en pantalla completa y, a veces, desplazarse.

Entonces, en un entorno de Linux con Libreoffice Calc, inspirado en esta respuesta de Unix y Linux StackExchange, esto es lo que puede hacer en 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*')) 

Úsalo así:

 viewDF(df1, df2, df3) 

Aprendí algo allí, que es la syntax de sustitución de Python 3 {}".format Los archivos abiertos son de solo lectura, en cualquier caso son archivos que luego se eliminan, por lo que es efectivamente una GUI para los marcos de datos. Libreoffice Calc para cada dataframe que le des, que puede ver a pantalla completa en pantallas separadas, y luego, una vez que cierra Calc, se limpia después de sí mismo.

El método to_clipboard () del dataframe se puede usar para copiar rápidamente y luego pegar el dataframe en una hoja de cálculo:

 df.to_clipboard() 

No soy usuario de Pandas, pero una búsqueda rápida de “pandas gui” muestra la propuesta GSOC 2012 del proyecto Pandas:

Actualmente, la única forma de interactuar con estos objetos es a través de la API. Este proyecto propone agregar una interfaz gráfica de usuario Qt o Tk simple con la que ver y manipular estos objetos.

Entonces, no hay GUI, pero si escribes uno usando Qt o Tk, el proyecto podría estar interesado en tu código.

Puedes usar GitHub Atom con el complemento de hidrógeno. En Mac puedes usar las teclas Cmd + Shift para ejecutar línea por línea. Incluso puedes seleccionar solo la variable y ver dentro. Los DataFrames se visualizan muy bien e incluso se pueden copiar. Escribí un blog para mostrar la forma de configurar estos. http://ojitha.blogspot.com.au/2016/08/08/atom-as-spark-editor.html

También he estado buscando gui muy simple. Me sorprendió que nadie mencionara gtabview . Es fácil de instalar (pip3 install gtabview), y carga datos de manera increíblemente rápida. Recomiendo usar gtabview si no está utilizando spyder o Pycharm.