如何将Pandas DataFrame转换为指定结构的自定义嵌套JSON
Pandas 转自定义嵌套JSON实现方法
实现思路
要实现自定义层级的JSON结构,我们可以通过分层分组聚合的方式逐层构建嵌套结构,不用依赖Pandas内置的to_json()方法,灵活度更高:
- 最内层按「酒店ID+房间ID+客户ID」分组,将会员等级与对应价格映射为字典
- 中间层按「酒店ID+房间ID」分组,将同房间下的所有客户价格信息组装为列表
- 最外层按「酒店ID」分组,将同酒店下的所有房间信息组装为列表
完整可运行代码
import pandas as pd import json # 1. 读取数据,替换为你的实际文件路径即可 df = pd.read_csv("your_file_path.csv") # 也可以直接用示例数据测试: # df = pd.DataFrame([ # [1, 100, 1, "Default", 100], # [1, 100, 2, "Default", 98], # [1, 101, 1, "Default", 200], # [1, 101, 1, "Discounted", 196], # [1, 101, 2, "Default", 202], # [1, 101, 3, "Default", 204], # ], columns=["Hotel_id", "Room_id", "Client_id", "Loayalty_level", "Price"]) # 2. 最内层聚合:构造每个客户对应的价格字典 client_price_df = df.groupby(["Hotel_id", "Room_id", "Client_id"]).apply( lambda x: { "clientId": x.name[2], "price": x.set_index("Loayalty_level")["Price"].rename(lambda k: k.lower()).to_dict() } ).reset_index(name="price_info") # 3. 中间层聚合:构造每个房间对应的价格列表 room_df = client_price_df.groupby(["Hotel_id", "Room_id"]).apply( lambda x: { "roomId": x.name[1], "prices": x["price_info"].tolist() } ).reset_index(name="room_info") # 4. 最外层聚合:构造最终的酒店结构 result = room_df.groupby("Hotel_id").apply( lambda x: { "hotelId": x.name, "rooms": x["room_info"].tolist() } ).tolist() # 单酒店场景直接取第一个元素,多酒店场景可保留列表 final_json = result[0] if len(result) == 1 else result # 打印验证/写入文件 print(json.dumps(final_json, indent=2, ensure_ascii=False)) # 写入本地文件: # json.dump(final_json, open("output.json", "w"), indent=2, ensure_ascii=False)
适配说明
如果后续需要调整JSON字段名、增减嵌套层级,只需要对应修改每层聚合的返回字段即可,无需重构整体逻辑。
内容的提问来源于stack exchange,提问作者neat_code
相关产品推荐
相关产品推荐

