2017-01-04 8 views
3

Каков наилучший способ редактирования панда данных в фляге?Редактировать pandas dataframe in flask html page

У меня есть dataframe, который я хочу вывести на HTML-странице с флягой (есть много примеров, как это сделать). Однако я просто не хочу выводить его, но я хочу сделать его доступным для редактирования. В идеале каждое поле должно быть полем ввода html.

Хотелось бы избежать создания формы вручную, а затем переконвертировать ее в dataframe. Есть ли элегантное решение? Предоставляют ли панды или любой другой пакет какие-либо функции, которые могли бы упростить эту задачу?

+0

Ну, в этот момент вы создаете веб-приложение ... так что для изменения частей таблицы в редактируемые поля вам понадобится JavaScript, щелкнув AJAX (или веб-сокеты, если вы хотите быть фантазией), чтобы обновить поле, когда пользователь выполнил редактирование и т. д. и т. д. и т. д. –

+0

Не нужно использовать JavaScript. Я рад, если есть способ создать форму или модель как-то, а затем отправить ее обратно на сервер с кнопкой отправки, которая переконвертирует его в dataframe – Nickpick

ответ

4

Вы можете использовать df.style (пример Styler) для визуализации DataFrame в виде сетки входов HTML.

np.random.seed(0) 

df = pd.DataFrame(np.random.randint(0, 100, (3, 3))) 
df.style.format('<input name="df" value="{}" />').render() 

Это будет отображаться как

HTML table

Если вы обернуть результат в <form> и представить его в какой-то конечной точки, строки запроса запроса (или POST тела) будет выглядеть

df=44&df=47&df=64&df=67&df=67&df=9&df=83&df=21&df=36 

Обратите внимание, что это ячейки кадра данных в строчном порядке. На данный момент, вы можете повторно создать фрейм данных с помощью

df = pd.DataFrame(np.asarray(request.values.getlist('df'), dtype=np.int).reshape((3, 3))) 

Как вы предложили в своем комментарии, другой подход к имени HTML входам с именем столбца, чтобы избежать необходимости изменить данные.

def html_input(c): 
    return '<input name="{}" value="{{}}" />'.format(c) 

df.style.format({c: html_input(c) for c in df.columns}).render() 

Данные, отправляемые на сервер будет выглядеть

0=44&1=47&2=64&0=67&1=67&2=9&0=83&1=21&2=36 

и вы можете восстановить кадр данных с помощью

df = pd.DataFrame(request.values.lists()) 

Это более элегантно, чем выше, отдельно от необходимо создать словарь форматирования {c: html_input(c) for c in df.columns}. К сожалению, функция форматирования передается только значение и ни одна из информации индекса.

+0

Это замечательно. Единственное улучшение, которое я мог видеть, - это способ сохранить имена столбцов dataframe, поэтому я могу прочитать их прямо, а должен сделать .reshape (...). Нецелесообразно иметь все поля, названные df, так как у меня их много. – Nickpick

+0

@nick, см. Мое редактирование. Я также немного упростил первый подход, чтобы передать строку в 'df.style.format', которая является ярлыком для того, что я делал ранее. –