【问题标题】:json_normalize a nested databasejson_normalize 嵌套数据库
【发布时间】:2021-12-22 21:50:14
【问题描述】:

我正在尝试将 json 数据库扁平化为 pandas 数据框,因为这是我第一次处理 json 格式,所以我无法做我想做的事。 数据库位于这里https://mtgjson.com/downloads/all-files/#allprices,根据模型,结构是这样的:

{
  "0120a941-9cfb-50b5-b5e4-4e0c7bd32410": {
    "mtgo": {
      "cardhoarder": {
        "currency": "USD",
        "retail": {
          "foil": {
            ..., // more rows
            "2020-04-21": 0.02
          },
          "normal": {
            ..., // more rows
            "2020-04-21": 0.02
          }
        }
      },
    },
    "paper": {
      "cardkingdom" : {
        "buylist": {
          "foil": {
            ..., // more rows
            "2020-04-21": 0.6
          },
          "normal": {
            ..., // more rows
            "2020-04-21": 0.01
          }
        },
        "currency": "USD",
        "retail": {
          "foil": {
            ..., // more rows
            "2020-04-21": 0.12
          },
          "normal": {
            ..., // more rows
            "2020-04-21": 0.02
          }
        }
      },
      "cardmarket": {
        "currency": "EUR",
        "retail": {
          "foil": {
            ..., // more rows
            "2020-04-21": 0.12
          },
          "normal": {
            ..., // more rows
            "2020-04-21": 0.02
          }
        }
      },
      "tcgplayer": {
        "currency": "USD",
        "retail": {
          "foil": {
            ..., // more rows
            "2020-04-21": 0.12
          },
          "normal": {
            ..., // more rows
            "2020-04-21": 0.02
          }
        }
      }
    }
  }
}

当我查看 json 文件时,我有这个:

{"meta": {"date": "2021-11-07", "version": "5.1.0+20211107"}, "data": {"00010d56-fe38-5e35-8aed-518019aa36a5": {"paper": {"cardkingdom": {"buylist": {"foil.....

当我做基本的pd.read_json('AllPrices.json') 我得到了这个

meta data
date 2021-11-07 NaN
version 5.1.0+20211107 NaN
00010d56-fe38-5e35-8aed-518019aa36a5 NaN {'paper': {'cardkingdom': {'buylist': {'foil':...
0001e0d0-2dcd-5640-aadc-a84765cf5fc9 NaN {'paper': {'cardkingdom': {'buylist': {'normal...

所以我做了一些研究,找到了json_normalize并写了这段代码:

with open('AllPrices.json','r') as f:
    data = json.loads(f.read())
pd.json_normalize(data, errors='ignore')

这通过扁平化 json 数据库完成了这项工作,但我以一行和 3100 万列结束。我想要的只是这个数据库中的一个信息,即我想要的日期的普通纸卡的 uuid 和 cardmarket 价格:

uuid paper.cardmarket.retail.normal.2021-11-07
00010d56-fe38-5e35-8aed-518019aa36a5 0.5
0001e0d0-2dcd-5640-aadc-a84765cf5fc9 0.25

我使用了record_path = 参数和meta = 参数,但我所做的最好的不是我预期的表。 我试过record_path = ['data'],它只给我一列中的uuid。

感谢您的帮助

【问题讨论】:

    标签: python json pandas


    【解决方案1】:

    在您的情况下,为每个uuid 记录使用json_normalize,然后提取所需的信息'paper.cardmarket.retail.normal':

    with open('AllPrices.json') as fp:
        prices = json.load(fp)
    
        data = []
        for uuid in prices['data']:
            df = pd.json_normalize(prices['data'][uuid]) \
                   .filter(like='paper.cardmarket.retail.normal')
            if df.empty:
                continue
            df.columns = df.columns.str.rsplit('.', 1).str[-1]
            df.index = [uuid]
            data.append(df)
        df = pd.concat(data)
    

    输出:(在AllPrices.json 文件上测试)

                                          2021-08-09  2021-08-11  2021-08-12  2021-08-13  ...  2021-10-27  2021-10-28  2021-11-02  2021-11-09
    00010d56-fe38-5e35-8aed-518019aa36a5        4.35        4.35        4.35        4.35  ...        4.35        4.35        4.35        4.35
    0001e0d0-2dcd-5640-aadc-a84765cf5fc9        4.95        4.95        3.45        3.45  ...        7.99        6.81        5.42        6.77
    0003caab-9ff5-5d1a-bc06-976dd0457f19        0.24        0.27        0.07        0.38  ...        0.25        0.04        0.13        0.36
    0003d249-25d9-5223-af1e-1130f09622a7        0.30        0.30        0.75        0.75  ...        0.15        0.20        0.04        0.25
    0004a4fb-92c6-59b2-bdbe-ceb584a9e401        0.27        0.14        0.19        0.10  ...        0.10        0.05        0.19        0.13
    ...                                          ...         ...         ...         ...  ...         ...         ...         ...         ...
    fffa4ccf-733e-513a-98f9-181b9549de62        0.23        0.15        0.21        0.21  ...        0.10        0.21        0.15        0.20
    fffb659e-b3fa-5cd8-9423-fe5ac74248b5        0.49        0.49        0.49        0.49  ...        0.35        0.35        0.35        0.20
    fffbc95a-c4d1-56aa-8653-8a7c71fe19ce        6.95        6.95        6.95        6.95  ...       10.26       10.26       10.26        6.43
    fffc1305-a118-559b-9504-3d7b56ca0bde        0.18        0.18        0.18        0.18  ...        0.04        0.04        0.04        0.04
    fffdd333-3789-5104-a8be-37be199a2cb1        0.87        0.73        0.99        0.99  ...        0.49        0.45        0.45        0.15
    
    [50568 rows x 75 columns]
    

    【讨论】:

    • 它能解决您的问题吗?现在我可以知道我的甲板的价格了。大声笑:)
    • 它工作得很好,比我预期的要好,因为我可以看到价格的演变!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2019-11-15
    • 2020-07-21
    • 2022-01-02
    • 2019-02-12
    • 2017-09-18
    • 2021-06-11
    相关资源
    最近更新 更多