You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas DataFrame按user_id、cat_id分组转自定义嵌套JSON如何实现?

解决方案

你当前的代码是直接把两个分组字段放在同一级groupby中,所以生成的键是(user_id, cat_id)格式的元组,只需要调整为二级嵌套分组逻辑,就能直接生成符合要求的嵌套结构,推荐写法如下:

import json

result = {}
# 一级分组:按user_id拆分
for user_id, user_group in df.groupby("user_id"):
    result[user_id] = {
        # 同一个user的pref_prod是固定值,取第一条即可
        "pref_prod": user_group["pref_prod"].iloc[0],
        "cat_id": {}
    }
    # 二级分组:对单个user的数据按cat_id拆分
    for cat_id, cat_group in user_group.groupby("cat_id"):
        # 提取prod_id和score字段,如需保留n位小数可以先对score做round处理
        # 示例:cat_group["score"] = cat_group["score"].round(3)
        prod_list = cat_group[["prod_id", "score"]].to_dict(orient="records")
        # 如需给指定条目添加fav_provider字段,可在此处加自定义逻辑,示例:
        # if cat_id in [43, 58]:
        #     for item in prod_list:
        #         item["fav_provider"] = result[user_id]["pref_prod"]
        result[user_id]["cat_id"][cat_id] = prod_list

# 如需输出为JSON字符串,直接调用dumps方法即可
json_output = json.dumps(result, indent=4, ensure_ascii=False)

如果你想基于已生成的gb字典做转换,也可以用下面的写法:

from collections import defaultdict

# 先获取每个user对应的pref_prod映射
user_pref_map = df.groupby("user_id")["pref_prod"].first().to_dict()
result = defaultdict(lambda: {"cat_id": {}, "pref_prod": None})

for (user_id, cat_id), prod_list in gb.items():
    # 清理掉prod列表里多余的pref_prod字段
    cleaned_prod_list = [
        {k: v for k, v in item.items() if k in ("prod_id", "score")} 
        for item in prod_list
    ]
    result[user_id]["cat_id"][cat_id] = cleaned_prod_list
    result[user_id]["pref_prod"] = user_pref_map[user_id]

# 转为普通字典
result = dict(result)

注意:标准JSON格式要求键必须为字符串,使用json.dumps输出时会自动将数字类型的user_id、cat_id转为字符串,如果需要保留数字键,直接使用Python字典对象即可。

内容的提问来源于stack exchange,提问作者LucyDrops

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:36:00