Python 在网页上显示数据帧
我正在使用Flask,但这可能适用于许多类似的框架 我构建了一个数据框架,例如Python 在网页上显示数据帧,python,pandas,flask,Python,Pandas,Flask,我正在使用Flask,但这可能适用于许多类似的框架 我构建了一个数据框架,例如 @app.route('/analysis/<filename>') def analysis(filename): x = pd.DataFrame(np.random.randn(20, 5)) return render_template("analysis.html", name=filename, data=x) @app.route(“/analysis/”) def分析(文
@app.route('/analysis/<filename>')
def analysis(filename):
x = pd.DataFrame(np.random.randn(20, 5))
return render_template("analysis.html", name=filename, data=x)
@app.route(“/analysis/”)
def分析(文件名):
x=pd.DataFrame(np.random.randn(20,5))
返回render_模板(“analysis.html”,name=filename,data=x)
template analysis.html如下所示
{% extends "base.html" %}
{% block content %}
<h1>{{name}}</h1>
{{data}}
{% endblock %}
{%extends“base.html”%}
{%block content%}
{{name}}
{{data}}
{%endblock%}
这是可行的,但是输出看起来很糟糕。它不使用换行符等。
我玩过data.to_html()
和data.to_string()
显示帧的最简单方法是什么?以下方法应适用:
@app.route('/analysis/<filename>')
def analysis(filename):
x = pd.DataFrame(np.random.randn(20, 5))
return render_template("analysis.html", name=filename, data=x.to_html())
# ^^^^^^^^^
@app.route(“/analysis/”)
def分析(文件名):
x=pd.DataFrame(np.random.randn(20,5))
返回render_模板(“analysis.html”,name=filename,data=x.to_html())
# ^^^^^^^^^
检查其他选项,如CSS样式
此外,您需要调整模板,如下所示:
{%extends“base.html”%}
{%block content%}
{{name}}
{{数据|安全}
{%endblock%}
为了告诉Jinja你在传递标记。感谢您的提示。好的,现在结合这里的提示,我已经获得了一些非常好的结果。在我使用的实际Python查看器中
@app.route('/analysis/<filename>')
def analysis(filename):
x = pd.DataFrame(np.random.randn(20, 5))
return render_template("analysis.html", name=filename, data=x)
@app.route(“/analysis/”)
def分析(文件名):
x=pd.DataFrame(np.random.randn(20,5))
返回render_模板(“analysis.html”,name=filename,data=x)
e、 我将完整的数据框发送到html模板。我的html模板是基于引导的。因此,我可以简单地写
{% extends "base.html" %}
{% block content %}
<h1>{{name}}</h1>
{{ data.to_html(classes="table table-striped") | safe}}
{% endblock %}
{%extends“base.html”%}
{%block content%}
{{name}}
{{data.to_html(classes=“table striped”)| safe}
{%endblock%}
引导还有许多其他选项,请查看此处:
Base.html基本上是从这里复制的
下一个问题显然是如何绘制这样一个框架。有人有博克的经验吗
谢谢马特和肖恩
thomas您可以使用它来显示熊猫数据帧并与之交互
举几个例子:
- 带过滤-
- 简单查看器-
df
的格式设置为可以在html中的行上进行迭代,则使用来记录(orient='records')
,这将以以下格式生成dict
:
‘records’ : list like [{column -> value}, … , {column -> value}]
这样,您就可以使用自己的方式在html中显示数据。
示例代码现在如下所示:
使用flask的Python代码
@app.route(“/analysis/”)
def分析(文件名):
x=pd.DataFrame(np.random.randn(20,5))
返回render_模板(“analysis.html”,name=filename,data=x.to_dict(orient='records'))
带有jinja的HTML代码
{%extends“base.html”%}
{%block content%}
列名1
列名2
列名3
{数据%中的行为%1}
{{行['列名称1']}
{{行['列名称2']}
{{行['列名称2']}
{%endfor%}
{%endblock%}
您是否尝试过在
块中显示它?还有,您遇到了什么问题?它不会呈现html。但是,尽管如此,我对html一无所知。也许我应该在这里投资一些时间。对我有用…给大家一个提示:看看你的数据框是否包含非unicode字符串,并将它们转换成unicode;否则,每当出现一些意外字符时,Jinja2将无法呈现模板。或者to_html()?我个人曾在Jinja2上使用它来简化数据帧的显示——仅供内部管理员使用——无论是在每次排序/筛选时立即加载还是通过ajax重新加载。不过,我正在寻找更好的解决方案。@tschm-确保不要同时进行两项更改-要么使用原始函数并添加
标记,要么使用将框架转换为\u html()
@tschm-如果要以html形式传递数据,则必须告诉Jinja不要逃避它。试试{data | safe}}
(没有任何pre
标签)。@tschm-我更新了上面的答案,希望能给你完整的解决方案,包括Sean Vieira关于Jinja模板的建议。如果您觉得它有助于解决您的问题,请随意单击复选标记并选择它作为正确答案。谢谢@当然。默认情况下,该表具有class=“dataframe”
,因此,将其与选择器结合起来,对
行中的
元素和其余行中的
元素进行样式设置,可以得到一些非常奇妙的结果。你甚至可以每隔一行加亮显示一次,改变鼠标的颜色等等。使用CSS3:)@tschm check out的强大功能,所有这些都是可能的-您可以设计自己的参数,然后(希望)根据生成的HTML调整CSS。如果您需要向不同的行添加类名(您可能不需要,这取决于它们如何生成CSS选择器),那么您只需在将其传递到模板呈现引擎之前对由frame.to_html()
生成的字符串进行一点处理即可。使用na_rep选项也很有帮助,例如data.to_html(类=“table table striped”,na_rep=“-”)。使用datatables.net可以对列进行正确排序(假设所有条目都是数字)。
@app.route('/analysis/<filename>')
def analysis(filename):
x = pd.DataFrame(np.random.randn(20, 5))
return render_template("analysis.html", name=filename, data=x.to_dict(orient='records'))
{% extends "base.html" %}
{% block content %}
<table class="table">
<thead>
<tr>
<th scope="col">Column name 1</th>
<th scope="col">Column name 2</th>
<th scope="col">Column name 3</th>
</tr>
</thead>
<tbody>
{% for row in data %}
<tr>
<td>{{row['Column name 1']}}</td>
<td>{{row['Column name 2']}}</td>
<td>{{row['Column name 2']}}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}