Подтвердить что ты не робот

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

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

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

Я бы подозревал, что подобное существует, но я должен быть Google с неправильными терминами. Было бы здорово, если бы он был Pandas конкретным, но я бы предположил, что могу использовать любой инструмент для принятия матрицы. (BTW - я нахожусь в Windows.)

Любые указатели?

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

4b9b3361

Ответ 1

Я использую 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))))

Обновление:

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

  1. Как уже отмечали другие, Python IDE, такие как Spyder Приходите со средствами просмотра данных.
  2. qgrid is другой вариант для виджета блокнота jupyter, который отображает кадры данных в блокноте.

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

Ответ 2

Обновление 2019 года: В настоящее время я работаю над преемником tabloo.


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

enter image description here

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

  • выберите столбец для фильтрации из поля со списком
  • написать "выражение подчеркивания" для фильтрации по этому столбцу с использованием произвольного кода Python. Например: _ > 0 для фильтрации только положительных значений или более сложных выражений, таких как (_ >= date(2016, 1, 1)) & (_ <= date(2016, 1, 31)), например для столбцов даты и времени.

Ответ 3

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

Ответ в 2016 году: мы должны использовать Pycharm и отправляться с помощью DataFrame viewer.

enter image description here

введите описание изображения здесь

Ответ 4

Pandas 0.13 в качестве экспериментальной особенности:

Поддержка PySide для qtpandas DataFrameModel и DataFrameWidget

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

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

from pandas.sandbox.qtpandas import DataFrameModel, DataFrameWidget

Ответ 5

Вы можете использовать метод dataframe to_html() для преобразования данных в html и отображения его в вашем браузере. Вот пример, предполагающий, что у вас есть dataframe, называемый 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 для jQuery www.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,
});

Ответ 6

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

введите описание изображения здесь

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

Ответ 8

Самое хорошее решение, которое я нашел, - это использование qgrid (см. здесь, а также упомянуто в документации pandas). Вы можете установить с помощью

pip install qgrid

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

qgrid.nbinstall()

Впоследствии это так же просто, как взять pandas df и запустить

qgrid.show_grid(df)

Еще одна приятная вещь - это то, что он рендерит и в nbviewer. Посмотрите это в действии здесь

Ответ 9

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

Ответ 10

Я работаю над графическим интерфейсом PyQt для pandas DataFrame, который может вам пригодиться. Он включает в себя копирование, фильтрацию и сортировку.

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

Ответ 11

Я настоятельно рекомендую вам использовать QTableView не QTableWidget. QTableView основан на программном обеспечении модели.

Существует два разных способа доступа этих виджетов к своим данным. Традиционный способ включает в себя виджеты, которые включают внутренние контейнеры для хранения данных. Однако этот подход очень интуитивно понятен во многих нетривиальных приложениях, что приводит к проблемам синхронизации данных. Второй подход - программирование модели/представления, в котором виджеты не поддерживают внутренние контейнеры данных.

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

введите описание изображения здесь

Ответ 12

Я тестировал множество предложений здесь, и ни один из них, похоже, не запускается и не устанавливается легко, особенно для 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, он очистится после себя.

Ответ 13

Метод dataframe to_clipboard() можно использовать для быстрого копирования, а затем вставки кадра данных в электронную таблицу:

df.to_clipboard()

Ответ 14

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

Ответ 15

Я не пользователь Pandas, но быстрый поиск "pandas gui" включает проект Pandas Предложение GSOC 2012:

В настоящее время единственным способом взаимодействия с этими объектами является API. В этом проекте предлагается добавить простой графический интерфейс Qt или Tk, с помощью которого можно просматривать и управлять этими объектами.

Итак, нет графического интерфейса, но если вы напишете его с помощью Qt или Tk, проект может заинтересовать ваш код.

Ответ 16

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

Ответ 17

Я также искал очень простой графический интерфейс. Я был удивлен, что никто не упомянул gtabview. Он прост в установке (pip3 install gtabview) и загружает данные невероятно быстро. Я рекомендую использовать gtabview, если вы не используете spyder или Pycharm.