pandas json_normalize 嵌套 json,其中字典仅存在于某些记录中

问题描述

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

我正在处理房屋清单文件并试图提取价格。价格数据存储如下,“价格”位于 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 进行列表理解即可。我已经合成了一些 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")