web-dev-qa-db-ja.com

Python / Pandas-DataFrameまたはMatrixを表示するためのGUI

Pandasパッケージを使用しています。これは基本的にラベル付きマトリックスであるDataFrameオブジェクトを作成します。多くの場合、長い文字列フィールドを持つ列、または多くの列を持つデータフレームがあるため、私はいくつかのテキスト出力関数を書きましたが、それらは素晴らしいものではありません。

私が本当に気に入っているのは、データフレーム/マトリックス/テーブルとやり取りできるシンプルなGUIです。 SQLツールで見られるように。基本的に、データの表示のような読み取り専用のスプレッドシートを持つウィンドウ。列を拡大したり、長いテーブルなどでページを上下に移動したりできます。

私はこのようなものが存在するのではないかと疑っていますが、間違った用語でグーグルにならなければなりません。 pandas特定の場合、それは素晴らしいことですが、私は、任意のマトリックス受け入れツールを使用できると思います。(ところで-私はWindows上にいます。)

ポインタはありますか?

または、逆に、誰かがこのスペースをよく知っていて、おそらくこれが存在しないことを知っている場合、私が自分自身をロールするために使用できるシンプルなGUIフレームワーク/ウィジェットがあるかどうかについての提案はありますか? (しかし、私のニーズは限られているため、大きなGUIフレームワークを学び、この1つのピースのために大量のコーディングを行う必要がありません。)

53
Ross R

PyQtのQTableWidgetを使用してDataFrameを表示します。 QTableWidgetObjectを作成し、QTableWidgetItems値で作成されたDataFrameを入力します。以下は、CSVファイルを読み取り、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 SpyderなどのIDEにはデータフレームビューアーが付属しています。
  2. qgrid は、ノートブック内のデータフレームをレンダリングするjupyter Notebookウィジェットの別のオプションです。

誰かがまだJupyter内のデータフレームを表示するためのシンプルなGUIをコーディングしたい場合、以下は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

16
user1319128

私は他のいくつかのGUIに完全に満足していなかったので、自分で作成しました。Githubで を維持しています 。例:

 enter image description here 

基本的なテーブル+プロット機能とは別に、データをフィルタリングする特定の方法が必要でした。

  • コンボボックスからフィルターする列を選択します
  • 任意のPythonコード。たとえば、正の値のみをフィルタリングする_ > 0、または(_ >= date(2016, 1, 1)) & (_ <= date(2016, 1, 31))などのより複雑な式を使用して、その列をフィルタリングする「アンダースコア式」を記述します。日時列用。
36
bluenote10

この質問は2012年に投稿されたもので、他の回答は適用するには古すぎる可能性があります。

2016年の答えは、Pycharmを使用する必要があり、DataFrameビューアーに同梱されていることです。

enter image description here

enter image description here

15
guo

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
11
working4coins

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のdatatablesプラグイン 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,
});
8
Yofe

すべての貴重な答えに加えて、Spyder IDE( https://github.com/spyder-ide )にはこの機能があります。以下の私のプリントスクリーンで見ることができます:

enter image description here

これは単なる客観的な事実であり、IDE :)の宣伝ではありません。

6
Adrien A.

私が見つけた最も良い解決策は、qgridを使用することです( here を参照し、 pandas docs で言及されています)。でインストールできます

pip install qgrid

IPythonノートブックでさらに(1回だけ)インストールする必要があります

qgrid.nbinstall()

その後、pandasdfを取得して実行するのと同じくらい簡単です。

qgrid.show_grid(df)

もう1つの良い点は、nbviewerでもレンダリングすることです。実際にご覧ください こちら

5
cd98

Python2.7には tkintertable があり、python3には pandastable があります。

5
ostrokach

データフレームのto_clipboard()メソッドを使用すると、データフレームをスプレッドシートにすばやくコピーして貼り付けることができます。

df.to_clipboard()
2
Mike Bannister

簡単な解決策はないようです。そのため、以下は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
2
Ross R

ここで多くの提案をテストしましたが、特にPython 3の場合、簡単に実行したりインストールしたりすることはできませんでした。これらのデータフレームを全画面表示にし、スクロール可能にすることもあります。

したがって、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置換構文{}".format開かれたファイルは読み取り専用です。いずれにしても、それらは後で削除されるファイルなので、事実上データフレームのGUIです。指定したデータフレームごとにLibreoffice Calcの複数のインスタンスが生成され、別々の画面で全画面表示できます。Calcを閉じると、Libreoffice Calcは自動的にクリーンアップされます。

2
cardamom

私はpandas DataFrameが役に立つと思うかもしれません。コピー、フィルタリング、ソートを含むPyQt GUIに取り組んでいます。

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

2
jsexauer

QTableViewではなくQTableWidgetを使用することを強くお勧めします。 QTableViewは、モデルビュープログラミングに基づいています。

これらのウィジェットがデータにアクセスする方法は2つあります。従来の方法には、データを保存するための内部コンテナを含むウィジェットが含まれます。このアプローチは非常に直感的ですが、多くの重要なアプリケーションでは、データ同期の問題につながります。 2番目のアプローチは、モデル/ビュープログラミングです。このプログラミングでは、ウィジェットは内部データコンテナーを保持しません。

pandas dataframeのモデルを作成しました。

# -*- 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 を参照してください

enter image description here

2
Ali Mirzaei

Ipythonノートブックを使用してpandas-ノートブックは、HTMLフレーム化されたデータフレームの表示を含む、pandas : http://ipython.org/notebook.html

1
stevegt

また、非常にシンプルなguiも検索しています。誰もgtabviewに言及していないことに驚いた。インストールは簡単で(pip3 install gtabview)、データを非常に高速にロードします。 spyderまたはPycharmを使用していない場合は、gtabviewを使用することをお勧めします。

0
Matthew Son

私はPandasユーザーではありませんが、「pandas gui」をすばやく検索すると、Pandasプロジェクトの GSOC 2012提案 =:

現在、これらのオブジェクトと対話する唯一の方法はAPIを使用することです。このプロジェクトでは、これらのオブジェクトを表示および操作するためのシンプルなQtまたはTk GUIを追加することを提案しています。

したがって、GUIはありませんが、QtまたはTkを使用してGUIを作成する場合、プロジェクトはコードに関心があるかもしれません。

0
Fred Foo

GitHub Atom Hydrogenプラグインを使用できます。Macでは、Cmd + Shiftキーを使用して行ごとに実行できます。変数のみを選択して内部を確認することもできます。これらを設定する方法を示すブログを書きました http://ojitha.blogspot.com.au/2016/08/atom-as-spark-editor.html

0
Ojitha