Вопрос по python, dataframe – Python / Pandas - графический интерфейс для просмотра DataFrame или Matrix

49

Я использую пакет Pandas, и он создает объект DataFrame, который в основном представляет собой помеченную матрицу. Часто у меня есть столбцы с длинными строковыми полями или фреймы данных со многими столбцами, поэтому простая команда печати не работает хорошо. Я написал несколько функций вывода текста, но они не очень хороши.

Что мне действительно нравится, так это простой графический интерфейс, который позволяет мне взаимодействовать с фреймом данных / матрицей / таблицей. Так же, как вы найдете в инструменте SQL. В основном это окно с таблицей только для чтения, например, представление данных. Я могу расширять столбцы, пролистывать страницы вверх и вниз по длинным таблицам и т. Д.

Я подозреваю, что нечто подобное существует, но я, должно быть, гуглюсь с неверными терминами. Было бы замечательно, если бы это было специфично для панд, но я бы предположил, что мог бы использовать любой принимающий матрицу инструмент. (Кстати, я в Windows.)

Есть указатели?

Или, наоборот, если кто-то хорошо знает это пространство и знает, что его, вероятно, не существует, есть ли какие-либо предложения о том, есть ли простой графический интерфейс / виджет, который я мог бы использовать для прокрутки своего собственного? (Но так как мои потребности ограничены, я не хочу изучать большую структуру GUI и делать кучу кодов для этого единственного куска.)

это можно сделать в спайдер (code.google.com/p/spyderlib)? Я использую Rstudio с R, и мне нравится видеть данные одним щелчком мыши. Я полностью согласен с тем, что сопоставимый инструмент для Python / Pandas отсутствует и iPython великолепен, но не в этой области. zach
я обнаружил, что записная книжка ipython довольно хороша для этого. zach
Выглядит как излишнее для моей необходимости, но я посмотрю на это, если нет ничего проще. Благодарю. Ross R
Будет ли Pyspread какой-либо помощи? Maria Zverina
Если вы хотите просмотреть весь фрейм данных в новом окне браузера, а не в ограниченной выходной ячейке, вы можете использовать простое решение python + javascript здесь:stackoverflow.com/questions/40554839/… Martin

Ваш Ответ

17   ответов
0

Я также искал очень простой графический интерфейс. Я был удивлен, что никто не упомянулgtabview. It is easy to install(pip3 install gtabview), and it loads data blazingly fast. I recommend using gtabview if you are not using spyder or Pycharm.

1

опирования, а затем вставки блока данных в электронную таблицу:

df.to_clipboard()
0

но быстрый поиск "pandas gui" поднимает проект PandasПредложение GSOC 2012:

Currently the only way to interact with these objects is through the API. This project proposes to add a simple Qt or Tk GUI with which to view and manipulate these objects.

Таким образом, GUI отсутствует, но если вы напишите его с использованием Qt или Tk, проект может быть заинтересован в вашем коде.

Спасибо, но я думаю, что создание полезного инструмента было бы выше моего уровня квалификации! Ross R
4

tkintertable для python2.7 иpandastable для python3.

pandastableError: User Rate Limit Exceeded
12

и другие ответы могут быть слишком старыми, чтобы его можно было применить.

Ответ в 2016 году заключается в том, что мы должны использовать Pycharm, и он поставляется сDataFrame Зритель.

enter image description here

enter image description here

как насчет случая, когда вы не используете режим отладки?
Не работает, когда мод отладки, е не используется. Но в Spyder мы можем просматривать без режима отладки.
1

и ни одно из них, кажется, не запускается и не устанавливается легко, особенно для Python 3, но сейчас я написал функцию, которая в основном выполняет то, что я хотел. Нужно, чтобы эти датафреймы были полноэкранными и иногда прокручивались.

Таким образом, в среде Linux с использованием Libreoffice Calc, вдохновленныйэтот ответ из 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 Открытые файлы доступны только для чтения, в любом случае они являются файлами, которые впоследствии удаляются, так что это фактически графический интерфейс для кадров данных. Он будет порождать несколько экземпляров Libreoffice Calc для каждого предоставленного вами фрейма данных, который вы можете просматривать в полноэкранном режиме на отдельных экранах, а затем после закрытия Calc очищается после себя.

1

авляют хороший чистый способ поэтапного построения и взаимодействия со структурами данных панд, в том числе отображение блоков данных в формате HTML:http://ipython.org/notebook.html

8

чтобы преобразовать dataframe в 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', '')

Если вы хотите, чтобы таблица была хорошо отформатирована и прокручивалась, вы можете использовать плагин datatables для jQuerywww.datatables.net, Вот javascript, который я использую для отображения таблицы свитков в направлениях x и y.

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

QTableView неQTableWidget. QTableView основан на программировании вида модели.

There are 2 different ways how these widgets can access their data. The traditional way involves widgets which include internal containers for storing data. This approach is very intuitive, however, in many non-trivial applications, it leads to data synchronization issues. The second approach is model/view programming, in which widgets do not maintain internal data containers

Я написал модель для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_()

Вы можете легко изменить модель для редактирования или показать элементы в зависимости от ваших потребностей. Для получения дополнительной информации обратитесь квида модели

enter image description here

5

qgrid (увидетьВоти также упоминается впанды документы). Вы можете установить с помощью

pip install qgrid

а затем вам нужно сделать дополнительную установку (только один раз) в вашемIPython ноутбук

qgrid.nbinstall()

Впоследствии это так же просто, как иpandas df и работает

qgrid.show_grid(df)

Другая хорошая вещь - то, что это оказывает вnbviewer тоже. Увидеть это в действииВот

Error: User Rate Limit Exceededpip install pip-autoremove а такжеpip-autoremove qgrid -yError: User Rate Limit Exceededstackoverflow.com/questions/7915998/…).
0

е использовать клавиши Cmd + Shift для выполнения построчно. Даже вы можете выбрать только переменную и посмотреть внутрь. Фреймы данных хорошо отображаются, и вы даже можете копировать. Я написал блог, чтобы показать способ их настройки. http://ojitha.blogspot.com.au/2016/08/atom-as-spark-editor.html

14

я используюQTableWidget из PyQt для отображенияDataFrame, Я создаюQTableWidgetObject а затем заселитьQTableWidgetItems создан сDataFrame ценности. Ниже приведен фрагмент кода, который читает файл CSV, создайтеDataFrame, затем отобразите в графическом интерфейсе:

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:

Поскольку этот ответ был довольно стар, он заслуживает обновления. Есть много вариантов, доступных для просмотра кадров данных в графическом интерфейсе.

  1. As others have pointed out, Python IDEs such as Spyder come with dataframe viewers.
  2. qgrid is another option for the jupyter notebook widget that renders the dataframes within the notebook.

Если кто-то все еще хочет написать простой графический интерфейс для просмотра кадров данных в 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()

enter image description here

чтоself во фрагменте?
Это относится к объекту класса, который расширяет класс пользовательского интерфейса, такой как QWidget или QMainWindow
34

ейсами, поэтому я создал свой собственный, который я сейчас поддерживаюна Github, Пример:

enter image description here

Помимо базовой функциональности таблица + график, я хотел иметь особый способ фильтрации данных:

select a column to filter from a combo box write an "underscore expression" to filter on that column using arbitrary Python code. For example: _ > 0 to filter positive values only, or more complex expressions like (_ >= date(2016, 1, 1)) & (_ <= date(2016, 1, 31)) e.g. for datetime columns.
Это именно то, что мне было нужно, спасибо большое.
@javed: Не могли бы вы использоватьGithub issue tracker и уточнить, что вы имеете в виду?
Gui показывает цифры - вместо цифр отображаются пустые столбцы.
1

нет простого решения. Итак, ниже есть небольшая функция для открытия кадра данных в 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
11

Поддержка PySide для qtpandasDataFrameModel а такжеDataFrameWidget

увидетьhttps://github.com/pydata/pandas/blob/master/doc/source/faq.rst

Вы можете добавить эту функцию, используя

from pandas.sandbox.qtpandas import DataFrameModel, DataFrameWidget
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededpandas.pydata.org/pandas-docs/dev/…
6

я хотел бы отметить, что Spyder IDE (https://github.com/spyder-ide) имеет эту функцию, как вы можете видеть на моем принтскрине ниже:

enter image description here

Это просто объективный факт, а не реклама какой-либо IDE :) Я не хочу инициировать какие-либо дебаты по этому вопросу.

2

который может оказаться для вас полезным. Включает в себя копирование, фильтрацию и сортировку.

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

Похожие вопросы