【问题标题】:How to deal with nested JSON in python?如何处理python中的嵌套JSON?
【发布时间】:2020-12-02 07:12:16
【问题描述】:

这个 JSON 是 API 提供给我的。

[{'archived': False,
  'associations': {'deals': {'results': [{'id': '2762673039',
                                          'type': 'line_item_to_deal'}]}},
  'createdAt': '2020-08-06T15:05:23.253Z',
  'id': '762434477',
  'properties': {'amount': '100',
                 'createdate': '2020-08-06T15:05:23.253Z',
                 'hs_lastmodifieddate': '2020-08-06T15:05:53.701Z',
                 'hs_object_id': '762434477',
                 'hs_product_id': '133248644',
                 'quantity': '1'},
  'updatedAt': '2020-08-06T15:05:53.701Z'},

除了嵌套在“关联”下的 id 之外,我想创建一个 pandas 数据框,其中包含 id 列以及与之关联的所有属性。本质上,我想删除嵌套在属性下的属性和嵌套在关联下的 id(以及重命名)。我该怎么办?

【问题讨论】:

  • pd.json_normalize(data)?
  • 是的,然后我可以重命名列并对其进行调整。这是我一直在寻找的功能。 Gabip 的解决方案也很丰富。

标签: python json pandas api


【解决方案1】:

首先,您可以在将数据转换为字典列表后将其展平:

import json
import pandas as pd

response = """[{"id": "133248644",
  "properties": {
            "createdate": "2020-08-06T15:05:23.253Z",
            "description": null,
            "hs_lastmodifieddate": "2020-08-06T15:05:23.253Z",
            "hs_object_id": "133248644",
            "name": "test product",
            "price": "100"},
 "createdAt": "2020-08-06T15:05:23.253Z",
 "updatedAt": "2020-08-06T15:05:23.253Z",
 "archived": false}, 
{"id": "133345685",
 "properties": {
             "createdate": 
             "2020-08-06T18:29:06.773Z", 
             "description": null,
             "hs_lastmodifieddate": "2020-08-06T18:29:06.773Z",
             "hs_object_id": "133345685",
             "name": "TEST PRODUCT 2",
             "price": "2222"},
 "createdAt": "2020-08-06T18:29:06.773Z", 
 "updatedAt": "2020-08-06T18:29:06.773Z",
 "archived": false}]"""

data = json.loads(response)
data_flat = [dict(id=x["id"], **x["properties"]) for x in data]

然后你可以用它创建一个DataFrame:

df = pd.DataFrame(data_flat)
print(df)

【讨论】:

  • 好的,我编辑了我的问题以反映另一个问题。我在“关联”下嵌套了另一个 id,我想在此数据框中将其称为“id2”。我该怎么做?
  • @JacobBayer results 键是否只包含列表中的一个元素?如果没有,您想如何从列表中提取id2(会是id2id3 等吗?)
  • results 有两个元素 idtype。只需要 id。称它为id2 很好。我的解决方案是使用data_flat= [dict(lineid=x["id"],id2=x["associations"]["deals"]["results"][0]["id"], **x["properties"]) for x in data]
猜你喜欢
  • 2020-12-14
  • 2016-05-06
  • 2014-04-15
  • 2021-07-07
  • 2021-05-22
  • 1970-01-01
  • 2019-06-11
  • 2015-09-13
  • 1970-01-01
相关资源
最近更新 更多