【问题标题】:pandas json_normalize nested json where dictionary only exists on some recordspandas json_normalize 嵌套 json,其中字典仅存在于某些记录上
【发布时间】:2021-04-14 04:42:53
【问题描述】:

我正在尝试在具有高度变化的嵌套 json 的数据文件上运行 pandas.json_normalize,其中记录的内容可能会有很大差异。

我正在处理一个房屋清单文件并试图提取价格。价格数据存储如下,'prices'在json文件中的第一个嵌套层:

       "prices": [
            {
                "amountMax": 420000,
                "amountMin": 420000,
                "availability": "false",
                "currency": "USD",
                "dateSeen": [
                    "2020-12-21T11:57:17.190Z",
                    "2020-12-25T02:35:41.009Z"
                ],
                "isSale": "false",
                "isSold": "true",
                "pricePerSquareFoot": 235,
                "sourceURLs": [
                    "https://www.redfin.com/FL/Coconut-Creek/.../home/4146834"
                ]
            }, # followed by additional entries

我正在使用以下代码行,如果我将输入文件编辑为包含“价格”部分的单个记录,则该代码行有效:

df3 = pd.json_normalize(df['records'], record_path='prices',
                meta=['id'],
                errors='ignore'                        
                )

但是,完整文件包含许多不包含价格部分的记录。如果我对包含 2 条记录(一条有,一条没有)的文件运行代码,则会失败并显示 KeyError: 'prices'

显然 json_normalize 中的 'errors='ignore'' 不足以处理错误。

我能做什么?我只想完全跳过没有价格的记录。

【问题讨论】:

    标签: json pandas nested normalize


    【解决方案1】:

    您的 JSON 上的列表理解可以做到这一点。我已经合成了一些 JSON 来匹配您对输入数据的描述。

    js = {
      "records": [
        {
          "prices": [
            {
              "amountMax": 420000,
              "amountMin": 420000,
              "availability": "false",
              "currency": "USD",
              "dateSeen": [
                "2020-12-21T11:57:17.190Z",
                "2020-12-25T02:35:41.009Z"
              ],
              "isSale": "false",
              "isSold": "true",
              "pricePerSquareFoot": 235,
              "sourceURLs": [
                "https://www.redfin.com/FL/Coconut-Creek/.../home/4146834"
              ]
            }
          ],
          "id": 1
        },{"id":2}
      ]
    }
    pd.json_normalize({"records":[r for r in js["records"] if "prices" in r.keys()]}["records"],record_path="prices",meta="id")
    
    

    【讨论】:

      猜你喜欢
      • 2019-11-15
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      • 2019-06-10
      • 2018-01-07
      • 2022-07-10
      • 2018-11-25
      相关资源
      最近更新 更多