如何将Pandas分组结果转换为Django所需的指定嵌套字典/列表结构?
Pandas多层索引聚合结果转Django可用嵌套字典
问题原因
你当前得到的dailyMinPrices是带两层索引(课程名、day_of_year)的Pandas Series:
- 直接调用
.values.tolist()只会提取Series存储的价格值,完全丢失索引里的课程、日期信息,所以只能拿到纯数字列表 - 直接对多层索引Series调用
.to_dict()会生成以(课程名, 日期)元组为键的平铺字典,不符合嵌套需求,索引存在空值时还会直接报错
另外你写的目标结构存在语法错误:字典值不能直接包裹列表用{},正确可JSON序列化的结构应该是课程名为键,对应值为记录列表,列表内每个元素是{"day_of_year": 数值, "price": 数值}格式的字典。
实现代码(无Python层显式for循环,高性能)
全程使用Pandas内置向量化方法,底层为C实现,大数据量下性能远高于手写Python循环:
# 第一步:将多层索引还原为普通DataFrame列 df_daily_min = dailyMinPrices.reset_index() # 第二步:分组转换为目标嵌套结构 dailyMinPrices_result = ( df_daily_min .groupby('course') # 注意:你原代码里写的分组字段是'hotel',和输出结果的Course字段不匹配,替换成实际的课程名字段即可 .apply(lambda group: group[['day_of_year', 'price']].to_dict('records')) .to_dict() )
转换后结构示例
{ "Course 1": [ {"day_of_year": 154, "price": 70.0}, {"day_of_year": 155, "price": 74.0}, {"day_of_year": 156, "price": 85.0}, {"day_of_year": 157, "price": 90.0}, # 其余日期数据按顺序排列 ], "Course 2": [ {"day_of_year": 154, "price": 96.0}, {"day_of_year": 155, "price": 112.0}, # 其余日期数据 ], "Course 3": [ # 对应课程的日期、价格数据 ] }
该结构可以直接传入Django的JsonResponse返回,不需要额外序列化处理。
逻辑说明
reset_index():将原本作为索引的课程名、day_of_year字段还原为DataFrame普通列,解决多层索引导致的转字典异常问题- 内层
to_dict('records'):Pandas内置方法,直接将每组的行数据转换为字段名:值格式的字典列表,不需要逐行遍历 - 外层
to_dict():将按课程分组后的Series转换为顶层的课程名:对应数据列表的字典结构
内容的提问来源于stack exchange,提问作者Miguel Herreros Cejas
相关产品推荐
相关产品推荐

