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
相关产品推荐
相关产品推荐

