Это может показаться вопросом новичка, но я застрял на нем, поскольку Python - не один из моих лучших языков.
У меня есть html-страница с таблицей внутри, и я хотел бы показать в ней фреймворк pandas. Как лучше всего это сделать? Использовать pandasdataframe.to_html?
ру
from flask import Flask;
import pandas as pd;
from pandas import DataFrame, read_csv;
file = r'C:\Users\myuser\Desktop\Test.csv'
df = pd.read_csv(file)
df.to_html(header = "true", table_id = "table")
html
<div class = "table_entrances" style = "overflow-x: auto;">
<table id = "table">
<thead></thead>
<tr></tr>
</table>
</div>






# Declare table
class SomeTable(Table):
status = Col('Customer')
city = Col('City')
product_price = Col('Country')
# Convert the pandas Dataframe into dictionary structure
output_dict = output.to_dict(orient='records')
# Populate the table
table = SomeTable(output_dict)
return (table.__html__())
или поскольку панды возвращают статический HTML-файл, вы можете отобразить его как страницу с помощью Flask
@app.route('/<string:filename>/')
def render_static(filename):
return render_template('%s.html' % filename)
Это идея того, как это сделать во Flask. Надеюсь, вы поймете это и дадите мне знать, если это не поможет!
import pandas as pd
df = pd.DataFrame({'col1': ['abc', 'def', 'tre'],
'col2': ['foo', 'bar', 'stuff']})
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return df.to_html(header = "true", table_id = "table")
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
Но я бы выбрал функцию Flask HTML, а не DataFrame в HTML (из-за стиля)
Вы можете оставить код HTML, просто сделав функцию, возвращающую df.to_html, другой функцией, которая будет отображать HTML в Интернете.
Если мы используем HTML-код, где его нужно разместить? Рядом с dockerfile?
рабочий пример:
код Python:
from flask import Flask, request, render_template, session, redirect
import numpy as np
import pandas as pd
app = Flask(__name__)
df = pd.DataFrame({'A': [0, 1, 2, 3, 4],
'B': [5, 6, 7, 8, 9],
'C': ['a', 'b', 'c--', 'd', 'e']})
@app.route('/', methods=("POST", "GET"))
def html_table():
return render_template('simple.html', tables=[df.to_html(classes='data')], titles=df.columns.values)
if __name__ == '__main__':
app.run(host='0.0.0.0')
html:
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<title>Title</title>
</head>
<body>
{% for table in tables %}
{{titles[loop.index]}}
{{ table|safe }}
{% endfor %}
</body>
</html>
или иначе используйте
return render_template('simple.html', tables=[df.to_html(classes='data', header = "true")])
и удалите строку {{titles[loop.index]}} из html
если вы проверяете элемент на html
<html lang = "en"><head>
<meta charset = "UTF-8">
<title>Title</title>
</head>
<body style = "">
<table border = "1" class = "dataframe data">
<thead>
<tr style = "text-align: right;">
<th></th>
<th>A</th>
<th>B</th>
<th>C</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>0</td>
<td>5</td>
<td>a</td>
</tr>
<tr>
<th>1</th>
<td>1</td>
<td>6</td>
<td>b</td>
</tr>
<tr>
<th>2</th>
<td>2</td>
<td>7</td>
<td>c--</td>
</tr>
<tr>
<th>3</th>
<td>3</td>
<td>8</td>
<td>d</td>
</tr>
<tr>
<th>4</th>
<td>4</td>
<td>9</td>
<td>e</td>
</tr>
</tbody>
</table>
</body></html>как вы можете видеть, у него есть tbody и thead с таблицей html. так что вы можете легко применить css.
Спасибо, Нихал, проработав курс веб-приложений на Python, и нам сказали поэкспериментировать с нашей первой сборкой. Первое, что пришло в голову, - это отобразить фреймворк на веб-сайте. Работает замечательно (хотя и без css уродливо!)
Есть идеи, как не отображать индексы строк?
из индекса удаления df перед его рендерингом.
использовать df.to_html(index = False)
@Nihal, размещенный вами HTML обрезает содержимое некоторых столбцов. Как мне обойти эту проблему?
@ user1783739 не могли бы вы привести пример вашей проблемы? или задайте вопрос и разместите лайк здесь.
есть идеи, почему мы используем слово «безопасно»? что означает "table | safe" и что он делает?
@DavidGladson проверьте эту ссылку
@Nihal, спасибо за ответ!
Для меня, использующего цикл Jinja for
{% for table in tables %}
{{titles[loop.index]}}
{{ table|safe }}
{% endfor %}
не сработало, поскольку он просто печатал каждый символ 1 к 1. Мне просто пришлось использовать
{{ table|safe }}
есть идеи, почему мы используем слово «безопасно»? что означает "table | safe" и что он делает?
@DavidGladson Безопасный фильтр явно помечает строку как «безопасную», т.е. она не должна автоматически экранироваться, если автоэкранирование включено. Подробнее об этом в документах jinja.palletsprojects.com/en/2.10.x/templates/… и этом SO stackoverflow.com/questions/12341496/jinja-2-safe-keyword
На случай, если кто-то сочтет это полезным. Я выбрал альтернативу, потому что мне нужно было больше настроек, включая возможность добавлять в таблицу кнопки, которые выполняли действия. Мне также очень не нравится стандартное форматирование таблиц, это очень некрасиво ИМХО.
...
df = pd.DataFrame({'Patient Name': ["Some name", "Another name"],
"Patient ID": [123, 456],
"Misc Data Point": [8, 53]})
...
# link_column is the column that I want to add a button to
return render_template("patient_list.html", column_names=df.columns.values, row_data=list(df.values.tolist()),
link_column = "Patient ID", zip=zip)
HTML-код: это динамически преобразует любой DF в настраиваемую HTML-таблицу.
<table>
<tr>
{% for col in column_names %}
<th>{{col}}</th>
{% endfor %}
</tr>
{% for row in row_data %}
<tr>
{% for col, row_ in zip(column_names, row) %}
{% if col == link_column %}
<td>
<button type = "submit" value = {{ row_ }} name = "person_id" form = "patient_form" class = "patient_button">
{{ row_ }}
</button>
</td>
{% else %}
<td>{{row_}}</td>
{% endif %}
{% endfor %}
</tr>
{% endfor %}
</table>
Код CSS
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td, th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
tr:nth-child(even) {
background-color: #dddddd;
}
Он работает очень хорошо и выглядит НАМНОГО лучше, чем выход .to_html.
куда бы я положил CSS? имя файла?
Для тех, кто ищет простой / лаконичный пример преобразования Pandas df в таблицу Flask / Jinja (по этой причине я и остановился на этом вопросе):
APP.PY - ЗАВОД ПРИЛОЖЕНИЙ:
## YOUR DF LOGIC HERE
@app.route("/")
def home():
return render_template('index.html' column_names=df.columns.values, row_data=list(df.values.tolist()), zip=zip)
Ваш статический шаблон (например, index.html)
<table>
<thead>
<tr>
{% for col in column_names %}
<th>
{{col}}
</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for row in row_data %}
<tr>
{% for col, row_ in zip(column_names, row) %}
<td>{{row_}}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
как насчет html-кода? я не должен давать ему идентификатор, чтобы загрузить эту таблицу в правильном месте моей веб-страницы? Или даже обновить его, когда появится новый фрейм данных?