【问题标题】:Nested JSON Normalize using Pandas, KeyError: "Try running with errors='ignore' as key 'company' is not always present"使用 Pandas 进行嵌套 JSON 规范化,KeyError:“尝试使用错误运行='ignore',因为键 'company' 并不总是存在”
【发布时间】:2021-08-09 15:06:49
【问题描述】:

我正在尝试规范化从 GraphQL API 获取的 JSON,并使用 json_normalize 将其转换为数据帧 JSON

        [{
          "node": {
            "organization": {
              "company": "System"
            },
            "id": "15",
            "ip": "10.6.11.110",
            "name": "devce_name",
            "deviceClass": {
              "logicalName": "class OEM",
              "class": "class",
              "description": "OEM",
              "deviceCategory": {
                "name": "Unknown"
              }
            },
            "asset": {
              "location": "",
              "make": "make"
            },
            "events": {
              "edges": [
                {
                  "node": {
                    "message": "Device message",
                    "severity": "3
                  }
                },
                {
                  "node": {
                    "message": "message",
                    "severity": "2",
                  }
                }
              ]
            }
          }
        },
        ...
     ]

这是我正在尝试使用 pandas 的 json_normalize

nd = pd.json_normalize(
    res,
    record_path=["node", "events", "edges"],
    meta= [["node", "organization", "company"], ["node", "name"], ["node", "ip"], ["node", "id"], ["node", "deviceClass"]]
)

如果元内部大小为 2 则没有错误,

例如:- meta= [["node", "organization"], ["node", "name"], ["node", "ip"], ["node", "id" ], ["node", "deviceClass"]]

但是当我在列表中尝试超过 2 个时,我得到了以下错误。

例如:meta= [["node", "organization", "company"], ["node", "name"],["node", "id"], ["node", "deviceClass"]]

** 键错误:“公司” 上述异常是以下异常的直接原因: …… KeyError:“尝试使用错误运行='ignore',因为键'company'并不总是存在”**

如何在 meta 中添加 3 个以上的字段?

谢谢

【问题讨论】:

    标签: python pandas json-normalize


    【解决方案1】:

    几天前我遇到了同样的问题,你可以尝试不同的方法

    nd1 = pd.json_normalize(js, record_path=["node", "events","edges"], /
                             meta = [["node", "id"]])
    
    nd2 = pd.merge(nd1, pd.json_normalize(js), on='node.id',how='left')
    

    【讨论】:

    • 感谢您的快速响应,但会有不需要的列
    • 使用 iloc 获取所需的列,例如 nd2.iloc[:,[0,1,2,3,4,5]]
    猜你喜欢
    • 2018-12-07
    • 2019-12-22
    • 2021-08-02
    • 2020-06-21
    • 2023-03-16
    • 2019-12-17
    • 2019-05-24
    • 2021-04-18
    • 2020-10-22
    相关资源
    最近更新 更多