如何用Python Pandas将嵌套JSON转换为对比式CSV表格?
解决多层嵌套JSON转颜色对比CSV/表格的方法
先拿一个符合需求的嵌套JSON示例来演示,假设数据结构如下:
{ "Group1": { "ItemA": {"color": "#FF0000"}, "ItemB": {"color": "#00FF00"}, "ItemC": {"color": "#0000FF"} }, "Group2": { "ItemA": {"color": "#FF5555"}, "ItemB": {"color": "#55FF55"}, "ItemD": {"color": "#5555FF"} }, "Group3": { "ItemA": {"color": "#FFAAAA"}, "ItemC": {"color": "#AA00AA"}, "ItemD": {"color": "#00AAAA"} }, "Group4": { "ItemB": {"color": "#FFFF00"}, "ItemC": {"color": "#FF00FF"}, "ItemD": {"color": "#00FFFF"} } }
你之前用pd.json_normalize(max_level=0)只能拿到外层分组的嵌套对象,是因为这个方法默认把嵌套层级展开成列,但你需要的是子项作为行、分组作为列的对比结构,得换个思路处理:
步骤1:加载并整理成长格式数据
先把所有分组的子项和对应颜色拆出来,生成包含Item、Group、Color三列的长表:
import json import pandas as pd # 加载JSON(如果是本地文件,用with open("your_data.json", "r") as f: json_data = json.load(f)) json_data = { "Group1": {"ItemA": {"color": "#FF0000"}, "ItemB": {"color": "#00FF00"}, "ItemC": {"color": "#0000FF"}}, "Group2": {"ItemA": {"color": "#FF5555"}, "ItemB": {"color": "#55FF55"}, "ItemD": {"color": "#5555FF"}}, "Group3": {"ItemA": {"color": "#FFAAAA"}, "ItemC": {"color": "#AA00AA"}, "ItemD": {"color": "#00AAAA"}}, "Group4": {"ItemB": {"color": "#FFFF00"}, "ItemC": {"color": "#FF00FF"}, "ItemD": {"color": "#00FFFF"}} } # 遍历嵌套结构,提取关键信息 rows = [] for group_name, items in json_data.items(): for item_name, details in items.items(): rows.append({ "Item": item_name, "Group": group_name, "Color": details["color"] }) df_long = pd.DataFrame(rows)
步骤2:转成对比用的宽格式表格
把长表转成子项为行、分组为列的结构,直接实现颜色值的横向对比:
# 用pivot方法实现行列转换 df_wide = df_long.pivot(index="Item", columns="Group", values="Color") # 保存为CSV文件 df_wide.to_csv("color_comparison.csv")
最终得到的表格结构如下(空值表示对应分组没有该子项):
| Item | Group1 | Group2 | Group3 | Group4 |
|---|---|---|---|---|
| ItemA | #FF0000 | #FF5555 | #FFAAAA | NaN |
| ItemB | #00FF00 | #55FF55 | NaN | #FFFF00 |
| ItemC | #0000FF | NaN | #AA00AA | #FF00FF |
| ItemD | NaN | #5555FF | #00AAAA | #00FFFF |
处理更深层级的嵌套
如果你的JSON有更深层级(比如Item下还有子子项),只需要在遍历的时候多加一层,把子项路径拼接起来即可:
rows = [] for group_name, items in json_data.items(): for item_name, details in items.items(): # 判断是否是更深层级的嵌套(值为字典且包含带color的子项) if isinstance(details, dict) and all(isinstance(v, dict) and "color" in v for v in details.values()): for subitem_name, sub_details in details.items(): rows.append({ "Item": f"{item_name}.{subitem_name}", # 用点连接层级名称 "Group": group_name, "Color": sub_details["color"] }) else: rows.append({ "Item": item_name, "Group": group_name, "Color": details["color"] })
这样就能兼容更复杂的嵌套结构,保证所有颜色值都能被提取并对比展示。
内容的提问来源于stack exchange,提问作者Nils
相关产品推荐
相关产品推荐

