使用唯一键展平/规范化深度嵌套的对象

Posted

技术标签:

【中文标题】使用唯一键展平/规范化深度嵌套的对象【英文标题】:Flattening/normalizing deeply nested objects with unique keys 【发布时间】:2021-08-20 19:03:22 【问题描述】:

解析 JSON 并将深度嵌套的属性设置为列的理想方法是什么。

"liked_food":
  "A":
     "-cheesecake":"name": "cheesecake", "calories":500,"ingredients":"sugar, eggs, cheese, crackers","serving_size":7,
     "-donut":"name": "donut", "calories":150,"ingredients":"sugar, eggs, yeast","serving_size":1.5,
  "B":
     "-cheesecake":"name": "cheesecake", "calories":500,"ingredients":"sugar, eggs, cheese, crackers","serving_size":7
  

目标: 获取上面的 JSON sn-p 格式,类似于下面的数据框:

name calories ingredients serving_size
A cheesecake 500 sugar, eggs, cheese, crackers 7
A donut 150 sugar, eggs, yeast 1.5
B cheesecake 500 sugar, eggs, cheese, crackers 7

只需将 JSON 文件转换为数据框即可产生:

使用 json_normalize 而不设置任何字段会产生:

我尝试在元字段中设置属性(即名称、卡路里、成分和服务大小),并且在未设置任何字段的情况下使用 json_normalize 时,数据框看起来与数据框相似。

希望我忽略了一些简单的事情。提前致谢!

【问题讨论】:

【参考方案1】:

如果dct 是您问题中的字典,那么:

df = pd.DataFrame(
    [
        "index": idx, **v
        for idx, d in dct["liked_food"].items()
        for v in d.values()
    ],
).set_index("index")
print(df)

打印:

             name  calories                    ingredients  serving_size
index                                                                   
A      cheesecake       500  sugar, eggs, cheese, crackers           7.0
A           donut       150             sugar, eggs, yeast           1.5
B      cheesecake       500  sugar, eggs, cheese, crackers           7.0

【讨论】:

以上是关于使用唯一键展平/规范化深度嵌套的对象的主要内容,如果未能解决你的问题,请参考以下文章

用嵌套列表和嵌套字典列表展平一个非常大的 Json

如何展平哈希,使每个键成为唯一值?

使用不同的键规范化嵌套的 json

为嵌套 XML 生成 XSL(非规范化格式)

规范化深层嵌套数据

使用 jq 保留键名展平 JSON