如何标准化具有很多不同集合的深度嵌套的 JSON 结果?

Posted

技术标签:

【中文标题】如何标准化具有很多不同集合的深度嵌套的 JSON 结果?【英文标题】:How do I normalize deeply nested JSON results that has a lot of different collections? 【发布时间】:2021-12-11 07:33:51 【问题描述】:

我所拥有的是 monday.com 通过 graphql 查询获得的结果。返回的数据包含许多不同的集合,例如字典列表的字典......例如。


  "data": 
    "boards": [
      
        "name": "board name",
        "groups": [
                    "title": "group title 1",
                    "title": "group title 2",
                    "title": "group title 3",
                    "title": "group title 4"
                  ]
       
     ]
   ,
  "account_id": "0000000"

我想做一个熊猫 dataframe 喜欢

     group.board    group.title
0    'board_name'   'group title 1'
1    'board_name'   'group title 2'
2    'board_name'   'group title 3'
3    'board_name'   'group title 4'

我试过了

pd.json_normalize(json_data, 'boards')

但我不断收到 KeyError: 'boards'

【问题讨论】:

因为json_data 没有密钥boards,所以您会收到密钥错误。 【参考方案1】:

您的 json 字典无效(缺少右括号,所以我修复了它)。我会这样做。在这里,我们将进入json_data["data"]["boards"] 的字典,因为这是数据所在的位置,使用"groups" 作为records 键,并使用字段"name" 作为元数据字段之一。

import pandas as pd

json_data = 
    "data": 
        "boards": [
            
                "name": "board name",
                "groups": [
                     "title": "group title 1" ,
                     "title": "group title 2" ,
                     "title": "group title 3" ,
                     "title": "group title 4" 
                ]
            ,
        ]
    ,
    "account_id": "0000000"


pd.json_normalize(json_data["data"]["boards"], "groups", ["name"])

输出:


    title           name
0   group title 1   board name
1   group title 2   board name
2   group title 3   board name
3   group title 4   board name

【讨论】:

谢谢!我想我在尝试简化此处问题的数据时忘记了它。不过谢谢!【参考方案2】:

您收到一个密钥错误,因为 json_data 没有密钥 boardsjson_data["data"] 可以,但您仍然无法获得预期的结果。

您需要将json_data["data"]["boards"] 作为字典列表传递,将“组”作为record_path,并将["name"] 作为meta 路径:

>>> df = pd.json_normalize(json_data["data"]["boards"], "groups", ["name"])
           title        name
0  group title 1  board name
1  group title 2  board name
2  group title 3  board name
3  group title 4  board name

然后,您可以重命名列:

>>> df.columns = ["group.title", "group.board"]

     group.title group.board
0  group title 1  board name
1  group title 2  board name
2  group title 3  board name
3  group title 4  board name

【讨论】:

谢谢!之后没有考虑改名。

以上是关于如何标准化具有很多不同集合的深度嵌套的 JSON 结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中解码具有许多唯一键的嵌套 JSON?

Mongoose:保存具有不同模式的嵌套 JSON

具有深度嵌套层次结构的不可变 NSDictionary:更改键的值?

Newtonsoft Json - 根据给定的选定属性序列化深度嵌套对象

JSON 可解码嵌套数组具有不同的格式和类型

AWS Glue:如何处理具有不同架构的嵌套 JSON