如何在Django中单独展示DataFrame分组后的平均周期数据?
解决方案
问题出在你将Pandas的分组统计结果直接转为HTML字符串传入模板,这种结构无法被Django模板引擎解析进行循环遍历。你需要先将Pandas的计算结果转换为Python原生的可迭代数据结构(如列表、字典),再传入模板进行循环渲染。
1. 调整视图代码:转换数据结构
不要将Pandas结果转为HTML,而是用to_dict()方法将其转换为模板可遍历的格式:
from django.shortcuts import render import pandas as pd from .models import Main def your_view(request): # 从数据库获取数据并转为DataFrame queryset = Main.objects.all().values("title", "cycle_time") df = pd.DataFrame(queryset) # 分组计算cycle_time平均值,重置索引保留title列 grouped_avg = df.groupby("title")["cycle_time"].mean().reset_index() # 转换为列表字典格式(每个元素是包含title和cycle_time的字典) grouped_data = grouped_avg.to_dict("records") # 传入模板 return render(request, "your_template.html", {"grouped_data": grouped_data})
如果你更倾向于键值对形式(title作为键,平均值作为值),可以这样转换:
grouped_data = grouped_avg.set_index("title")["cycle_time"].to_dict()
2. 模板中使用for循环渲染
根据传入的数据结构,编写对应的模板代码:
列表字典格式的渲染:
<div class="grouped-stats"> <h2>各标题分组平均Cycle Time</h2> {% for item in grouped_data %} <div class="stat-item"> <span class="title">{{ item.title }}</span> <span class="avg-time">平均耗时:{{ item.cycle_time|floatformat:2 }}</span> </div> {% empty %} <p>暂无统计数据</p> {% endfor %} </div>
键值对字典格式的渲染:
<div class="grouped-stats"> <h2>各标题分组平均Cycle Time</h2> {% for title, avg_time in grouped_data.items %} <div class="stat-item"> <span class="title">{{ title }}</span> <span class="avg-time">平均耗时:{{ avg_time|floatformat:2 }}</span> </div> {% empty %} <p>暂无统计数据</p> {% endfor %} </div>
3. 保留原HTML表格的同时单独展示数据(可选)
如果需要同时展示Pandas生成的完整HTML表格和单独的分组数据,可以在视图中同时传入两种数据:
return render(request, "your_template.html", { "grouped_data": grouped_data, "table_html": grouped_avg.to_html() })
模板中用|safe过滤器渲染HTML表格:
<!-- 完整表格 --> <div class="full-table"> {{ table_html|safe }} </div> <!-- 单独分组展示 --> <div class="grouped-stats"> <!-- 上面的循环代码 --> </div>
内容的提问来源于stack exchange,提问作者Ederson
相关产品推荐
相关产品推荐

