我正在尝试使用一些样式选项将pandas DataFrame渲染为Django模板。我的问题可能与以下问题有关:https://github.com/pandas-dev/pandas/issues/13140。
关于这个问题,我在堆栈溢出中经历了以下答案:
这是我的模特。py
class Fruit(models.Model):
fruit_name = models.CharField(max_length=20)
car_name = models.CharField(max_length=20)
week = models.DecimalField(max_digits=3, decimal_places=1, blank=True)
price = models.DecimalField(max_digits=3, decimal_places=1, blank=True)
def __str__(self):
return '%s & %s' % (self.fruit_name, self.car_name)
and views.py
def get_fruit(request, *args, **kwargs):
df = pd.DataFrame(list(Fruit.objects.all().values('fruit_name', 'car_name', 'week', 'price')))
df2 = df
cols = ['week', 'price']
df2[cols] = df2[cols].apply(pd.to_numeric, errors='coerce')
df3 = pd.pivot_table(df2, index='car_name', columns=['fruit_name', 'week'], values='price', fill_value='')
df3_index = df3.index
html = df2.style.applymap(color_red, subset=['price']).render()
df3_html = df3.style \
.applymap(color_red, subset=df3_index) \
.render()
context = {'html': html,
'df3_html': df3_html
}
return render(request, 'get_fruit.html', context)
def color_red(s):
color = 'red' if (-5.0 <= s >= 5.0) else 'black'
return 'color: %s' % color
get_fruit.html
{% extends "base.html" %}
{% block content %}
<h1> Table</h1>
{{ html | safe}}
<br>
<h1>Pivot table</h1>
{{ df3_html | safe }}
{% endblock %}
模板呈现为:get_fruit webpage
如上图所示,df.style适用于我的表(其中值> 5为红色),而不适用于数据透视表。我不确定这是错误还是在我的代码中。
我正在使用Django:2.0.6; Jinja2:2.10;熊猫:0.23.1和Python:3.6。
感谢您的帮助。