我想将一个pandas数据帧显示为带有flask的boostrap-html表,因此我尝试了以下方法:
数据(.csv表):
Name Birth Month Origin Age Gender Carly Jan Uk 10 F Rachel Sep UK 20 F Nicky Sep MEX 30 F Wendy Oct UK 40 F Judith Nov MEX 39 F
python代码(python_script.py):
from flask import * import pandas as pd app = Flask(__name__) @app.route("/tables") def show_tables(): data = pd.read_csv('table.csv') data.set_index(['Name'],inplace=True) data.index.name=None females = data.loc[data.Gender=='f'] return render_template('view.html',tables=[females.to_html(classes='female')],titles = ['na','Female surfers']) if __name__ == "__main__": app.run(debug=True)
模板目录(view.html):
<!doctype html> <title>Simple tables</title> <link rel=stylesheet type=text/css href="{{ url_for('static',filename='style.css') }}"> <div class=page> <h1>Surfer groups</h1> {% for table in tables %} <h2>{{titles[loop.index]}}</h2> {{ table|safe }} {% endfor %} </div>
boostrap style.css:
body { font-family: "Lucida Sans Unicode","Lucida Grande",sans-serif;} a,h1,h2 { color: #377ba8; } h1,h2 { margin: 0; } h1 { border-bottom: 2px solid #eee; } h2 { font-size: 1.2em; } table.dataframe,.dataframe th,.dataframe td { border: none; border-bottom: 1px solid #C8C8C8; border-collapse: collapse; text-align:left; padding: 10px; margin-bottom: 40px; font-size: 0.9em; } .male th { background-color: #add8e6; color: white; } .female th { background-color: #77dd77; color: white; } tr:nth-child(odd) { background-color:#eee; } tr:nth-child(even) { background-color:#fff; } tr:hover { background-color: #ffff99;}
到目前为止,当我运行我的python_script.py时:
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger pin code: 123-221-151
我有两个问题:一个Not Found错误,当我转到http://127.0.0.1:5000/tables时,我得到了一个builtins.KeyError KeyError:’Name’.有关如何将pandas数据框显示为带有pandas和flask的表的任何想法吗?
解决方法
这里的问题是data.csv文件.当你对它执行read_csv()时:
In [45]: pd.read_csv("/tmp/a.csv") Out[45]: Name Birth Month Origin Age Gender 0 Carly Jan Uk 10 F 1 Rachel Sep UK 20 F 2 Nicky Sep MEX 30 F 3 Wendy Oct UK 40 F 4 Judith Nov MEX 39 F In [46]: df = pd.read_csv("/tmp/a.csv") In [47]: df.columns Out[47]: Index([u'Name Birth Month Origin Age Gender'],dtype='object')
正如您所看到的,只有一列而不是四列,因为它无法理解“出生月”应该是一列.要解决此问题,您可以打开文件并将第一行更改为:
"Name" "Birth Month" "Origin" "Age" "Gender"
然后,在阅读csv时:
In [62]: pd.read_csv("/tmp/a.csv",sep='\s+',quotechar='"') Out[62]: Name Birth Month Origin Age Gender 0 Carly Jan Uk 10 F 1 Rachel Sep UK 20 F 2 Nicky Sep MEX 30 F 3 Wendy Oct UK 40 F 4 Judith Nov MEX 39 F
或者你也可以将出生月改为Birth_Month
对于’404 Not Found’错误,问题是您没有为’/’定义任何路由.所以,(编辑csv的标题后)我会做类似的事情:
from flask import * import pandas as pd app = Flask(__name__) @app.route("/tables") def show_tables(): data = pd.read_csv("/tmp/a.csv",quotechar='"') data.set_index(['Name'],inplace=True) data.index.name=None females = data.loc[data.Gender=='F'] return render_template('view.html','Female surfers']) @app.route("/") def show_home(): return "Hello Guys! Visit: <a href='/tables'> this link </a>" if __name__ == "__main__": app.run(debug=True)