wake-up-neo.net

Python/Pandas - GUI zum Anzeigen eines DataFrame oder einer Matrix

Ich verwende das Pandas-Paket und es wird ein DataFrame-Objekt erstellt, bei dem es sich im Wesentlichen um eine beschriftete Matrix handelt. Oft habe ich Spalten mit langen String-Feldern oder Dataframes mit vielen Spalten, so dass der einfache Druckbefehl nicht gut funktioniert. Ich habe einige Textausgabefunktionen geschrieben, aber sie sind nicht so toll.

Was ich wirklich lieben würde, ist eine einfache grafische Benutzeroberfläche, mit der ich mit einem Datenrahmen/einer Matrix/Tabelle interagieren kann. Genau wie Sie es in einem SQL-Tool finden würden. Grundsätzlich ein Fenster mit einer schreibgeschützten Ansicht, in der nur Daten in die Daten geschrieben werden können. Ich kann Spalten erweitern, durch lange Tabellen auf- und abblättern usw.

Ich würde vermuten, dass so etwas existiert, aber ich muss mit den falschen Bedingungen googeln. Es wäre großartig, wenn es Pandas spezifisch ist, aber ich könnte mir vorstellen, dass ich ein beliebiges Werkzeug zur Matrixannahme verwenden könnte. (BTW - ich bin unter Windows.)

Irgendwelche Hinweise?

Oder, wenn jemand diesen Bereich gut kennt und weiß, dass dieser wahrscheinlich nicht existiert, irgendwelche Vorschläge, ob es ein einfaches GUI-Framework/Widget gibt, das ich verwenden könnte, um mein eigenes zu rollen? (Da meine Bedürfnisse jedoch begrenzt sind, zögere ich mich, ein großes GUI-Framework kennen zu lernen und eine Menge Codierung für dieses eine Stück zu machen.)

48
Ross R

Ich verwende QTableWidget von PyQt, um eine DataFrame anzuzeigen. Ich erstelle eine QTableWidgetObject und fülle sie mit QTableWidgetItems aus, die mit DataFrame-Werten .. erstellt wurde. Im Folgenden sehen Sie den Codeausschnitt, der eine CSV-Datei liest, erstellen Sie eine DataFrame und zeigen Sie dann in einer GUI an:

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))))

Update:

Da diese Antwort ziemlich alt war, verdient sie ein Update. Es gibt jetzt viele Optionen, um die Datenframes in der GUI anzuzeigen.

  1. Wie andere darauf hingewiesen haben, kommen Python-IDEs wie Spyder Mit Dataframe-Viewern.
  2. qgrid ist eine weitere Option für das Jupyter-Notizbuch-Widget, die die Datenframes innerhalb des Notizbuchs darstellt.

Wenn noch eine einfache GUI für die Anzeige der Datenframes in Jupyter programmiert werden soll, folgt das vollständige, minimale Beispiel mit 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()

 enter image description here

14
user1319128

Ich war mit anderen GUIs nicht ganz zufrieden, also habe ich meine eigene erstellt, die ich jetzt auf Github pflege. Beispiel:

 enter image description here

Abgesehen von der grundlegenden Funktionalität von Table + Plot wollte ich eine bestimmte Methode zum Filtern von Daten haben:

  • wählen Sie eine Spalte aus, die Sie aus einem Kombinationsfeld filtern möchten
  • schreiben Sie einen "Unterstreichungsausdruck", um diese Spalte mit beliebigem Python-Code zu filtern. Zum Beispiel: _ > 0, um nur positive Werte zu filtern, oder komplexere Ausdrücke wie (_ >= date(2016, 1, 1)) & (_ <= date(2016, 1, 31)), z. für datetime-Spalten.
33
bluenote10

Die Frage wurde 2012 veröffentlicht und andere Antworten sind möglicherweise zu alt, um sie zu beantragen.

Die Antwort in 2016 lautet, wir sollten Pycharm verwenden und es wird mit DataFrame viewer ausgeliefert.

enter image description here

 enter image description here

12
guo

Pandas 0.13 bietet als experimentelles Feature:

PySide-Unterstützung für die qtpandas DataFrameModel und DataFrameWidget

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

sie können diese Funktion mit hinzufügen

from pandas.sandbox.qtpandas import DataFrameModel, DataFrameWidget
11
working4coins

Sie können die Dataframe-Methode to_html () verwenden, um das Dataframe in HTML zu konvertieren und in Ihrem Browser anzuzeigen. Hier ist ein Beispiel, dass Sie einen Datenrahmen namens df haben. Sie sollten in der Dokumentation nachsehen, welche anderen Optionen in der to_html () -Methode verfügbar sind.

# 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', '')

Wenn Sie möchten, dass die Tabelle schön formatiert und scrollbar ist, können Sie das Plug-in für datatables für jQuery www.datatables.net verwenden. Hier ist das Javascript, das ich verwende, um eine Tabelle der Schriftrollen in x- und y-Richtung anzuzeigen.

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

Neben all den wertvollen Antworten möchte ich erwähnen, dass der Spyder IDE ( https://github.com/spyder-ide ) diese Funktion hat, wie Sie auf meinem Druckbildschirm sehen können unten:

 enter image description here

Dies ist nur eine objektive Tatsache und keine Werbung für irgend welche IDE :) Ich möchte keine Debatte über diese Frage auslösen. 

6
Adrien A.

Die schönste Lösung, die ich gefunden habe, ist qgrid (siehe hier und auch in den pandas docs ). Sie können durch installieren

pip install qgrid

und dann müssen Sie eine weitere Installation (nur einmal) in Ihrem IPython-Notizbuch durchführen

qgrid.nbinstall()

Danach ist es so einfach, Ihre pandasdf mitzunehmen und auszuführen

qgrid.show_grid(df)

Die andere schöne Sache ist, dass es auch in nbviewer dargestellt wird. Sehen Sie es in Aktion hier

5
cd98

Es gibt tkintertable für Python2.7 und pandastable für Python3. 

3
ostrokach

Ich habe an einer PyQt-Benutzeroberfläche für Pandas DataFrame gearbeitet, die möglicherweise hilfreich ist. Dazu gehört das Kopieren, Filtern und Sortieren.

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

2
jsexauer

Mit der to_clipboard () -Methode des dataframe können Sie das Datenframe schnell kopieren und dann in eine Kalkulationstabelle einfügen:

df.to_clipboard()
1
Mike Bannister

Es scheint, dass es keine einfache Lösung gibt. Nachfolgend finden Sie eine kleine Funktion zum Öffnen eines Datenrahmens in Excel. Es ist wahrscheinlich kein Code für die Produktionsqualität, aber es funktioniert für mich!

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
1
Ross R

Ich habe viele der Vorschläge hier getestet und keiner von ihnen scheint leicht zu laufen oder zu installieren, insbesondere für Python 3, aber jetzt habe ich eine Funktion geschrieben, die im Grunde das schafft, was ich wollte. Diese Datenrahmen müssen im Vollbildmodus angezeigt werden und sind manchmal scrollbar.

In einer Linux-Umgebung mit Libreoffice Calc, die von dieser Antwort von Unix und Linux StackExchange inspiriert ist, können Sie in Python 3 Folgendes tun:

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*'))

Verwenden Sie es so:

viewDF(df1, df2, df3)

Ich habe dort etwas gelernt, nämlich die Python 3-Substitutionssyntax {}".format Die geöffneten Dateien sind schreibgeschützt. In jedem Fall handelt es sich um Dateien, die später gelöscht werden. Es handelt sich also praktisch um eine grafische Benutzeroberfläche für Datenrahmen. Es werden mehrere Instanzen von Libreoffice Calc für jedes von Ihnen vergebene Datenframe erzeugt. Sie können den Vollbildmodus auf separaten Bildschirmen anzeigen. Sobald Sie Calc schließen, wird der Befehl nach dem Aufräumen gelöscht. 

1
cardamom

Ich empfehle dringend, QTableView und nicht QTableWidget zu verwenden. QTableView basiert auf der Modellansicht-Programmierung.

Es gibt zwei Möglichkeiten, wie diese Widgets auf ihre Daten zugreifen können. Der traditionelle Weg umfasst Widgets, die interne Container zum Speichern von Daten enthalten. Dieser Ansatz ist sehr intuitiv, führt jedoch in vielen nicht trivialen Anwendungen zu Problemen bei der Datensynchronisierung. Der zweite Ansatz ist die Modell-/Ansichtsprogrammierung, bei der Widgets keine internen Datencontainer verwalten

Ich habe ein Modell für pandas dataframe geschrieben. 

# -*- 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_()

Sie können das Modell leicht ändern, um die Elemente je nach Bedarf zu bearbeiten oder anzuzeigen. Weitere Informationen finden Sie unter Modellansicht

 enter image description here

1
Ali Mirzaei

Ich verwende ipython-Notebooks, um Pandas anzutreiben. Notebooks bieten eine saubere Möglichkeit, inkrementell zu erstellen und mit Pandas-Datenstrukturen zu interagieren, einschließlich der HTML-Anzeige von Datenrahmen: http://ipython.org/notebook.html

1
stevegt

Ich habe auch sehr einfache Gui gesucht. Ich war überrascht, dass niemand gtabview..__ erwähnt hat. Es ist einfach zu installieren (pip3 install gtabview), und es lädt die Daten unglaublich schnell. 

0
Matthew Son

Ich bin selbst kein Pandas-Benutzer, aber eine schnelle Suche nach "Pandas Gui" zeigt den Vorschlag des Pandas-Projekts GSOC 2012 :

Derzeit besteht die einzige Möglichkeit zur Interaktion mit diesen Objekten über die API. In diesem Projekt wird vorgeschlagen, eine einfache Qt- oder Tk-GUI hinzuzufügen, mit der diese Objekte angezeigt und bearbeitet werden können.

Es gibt also keine grafische Benutzeroberfläche, aber wenn Sie mit Qt oder Tk eine schreiben, könnte das Projekt an Ihrem Code interessiert sein.

0
Fred Foo

Sie können GitHub Atom mit dem Wasserstoff-Plugin verwenden. In Mac können Sie Cmd + Shift-Tasten verwenden, um Zeile für Zeile auszuführen. Selbst Sie können nur die Variable auswählen und hineinschauen. DataFrames werden schön angezeigt und Sie können sogar kopieren. Ich habe einen Blog geschrieben, um den Weg zu zeigen, diese zu konfigurieren . http://ojitha.blogspot.com.au/2016/08/atom-as-spark-editor.html

0
Ojitha