如何修改Pandas分组聚合后的JSON输出结构?
解决MultiIndex Series转嵌套JSON的问题
你遇到的问题本质是MultiIndex(多级索引)的Series在默认转JSON时,会把索引元组直接序列化为字符串键,所以才出现了{"["John Doe","A"]":201.37}这种不符合预期的格式。要得到你想要的嵌套结构,只需要先调整数据结构,再转JSON即可,下面是两种简单高效的方法:
方法一:用unstack()转换结构后转JSON
这是最直接的方案,先把多级索引的Series转换成以USER为行索引、GROUP为列的DataFrame,再用orient='index'参数生成嵌套JSON:
# 假设你的聚合结果是agg_series(即df.groupby(['USER', 'GROUP'])['VALOR'].sum()的返回值) agg_df = agg_series.unstack(level='GROUP') # 将GROUP索引转成列 target_json = agg_df.to_json(orient='index')
执行后target_json的格式就是你想要的:
{"John Doe": {"A": 201.37, "B":480.59, "C":1504.16}, "John Jones": {"A": 239.95, "B":1123.39, "C":1736.05}}
原理说明:
unstack(level='GROUP'):把多级索引中的GROUP层级从行索引“拆”成列,此时数据结构变成每行对应一个用户,每列对应一个分组,单元格是求和后的值。to_json(orient='index'):指定以行索引(即USER)作为外层JSON键,每行的列和值作为内层键值对,完美匹配你要的嵌套结构。
方法二:直接生成嵌套字典再转JSON
如果你更喜欢用字典操作,也可以先把Series转换成嵌套字典,再用json.dumps()序列化:
import json # 先按USER分组,把每个用户的GROUP和VALOR转成字典,再整体转成外层字典 result_dict = agg_series.groupby(level='USER').apply( lambda x: x.droplevel('USER').to_dict() ).to_dict() target_json = json.dumps(result_dict)
这个方法和方法一的效果完全一致,适合需要对字典做额外处理的场景。
内容的提问来源于stack exchange,提问作者drec4s
相关产品推荐
相关产品推荐

