如何将pandas数据帧显示为flask-boostrap表?

我想将一个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", sep='\s+', quotechar='"')
    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'])

@app.route("/")
def show_home():
    return "Hello Guys! Visit: <a href='/tables'> this link </a>"

if __name__ == "__main__":
    app.run(debug=True)
点赞