json_normalize JSON 文件,列表包含字典(包括示例)

Posted

技术标签:

【中文标题】json_normalize JSON 文件,列表包含字典(包括示例)【英文标题】:json_normalize JSON file with list containing dictionary (sample included) 【发布时间】:2018-12-16 14:23:36 【问题描述】:

这是我使用 2 条记录的示例 json 文件:

["Time":"2016-01-10",
"ID"
:13567,
"Content":
    "Event":"UPDATE",
    "Id":"EventID":"ABCDEFG",
    "Story":[
        "@ContentCat":"News",
        "Body":"Related Meeting Memo: Engagement with target firm for potential M&A.  Please be on call this weekend for news updates.",
        "BodyTextType":"PLAIN_TEXT",
        "DerivedId":"Entity":["Id":"Amy","Score":70, "Id":"Jon","Score":70],
        "DerivedTopics":"Topics":[
                            "Id":"Meeting","Score":70,
                            "Id":"Performance","Score":70,
                            "Id":"Engagement","Score":100,
                            "Id":"Salary","Score":70,
                            "Id":"Career","Score":100]
                        ,
        "HotLevel":0,
        "LanguageString":"ENGLISH",
        "Metadata":"ClassNum":50,
                    "Headline":"Attn: Weekend",
                    "WireId":2035,
                    "WireName":"IIS",
        "Version":"Original"
                ],
"yyyymmdd":"20160110",
"month":201601,
"Time":"2016-01-12",
"ID":13568,
"Content":
    "Event":"DEAL",
    "Id":"EventID":"ABCDEFG2",
    "Story":[
        "@ContentCat":"Details",
        "Body":"Test email contents",
        "BodyTextType":"PLAIN_TEXT",
        "DerivedId":"Entity":["Id":"Bob","Score":100, "Id":"Jon","Score":70, "Id":"Jack","Score":60],
        "DerivedTopics":"Topics":[
                            "Id":"Meeting","Score":70,
                            "Id":"Engagement","Score":100,
                            "Id":"Salary","Score":70,
                            "Id":"Career","Score":100]
                        ,
        "HotLevel":0,
        "LanguageString":"ENGLISH",
        "Metadata":"ClassNum":70,
                    "Headline":"Attn: Weekend",
                    "WireId":2037,
                    "WireName":"IIS",
        "Version":"Original"
                ],
"yyyymmdd":"20160112",
"month":201602]

我正在尝试获取实体 ID 级别的数据框(从记录 1 中提取 AmyJon,从记录 2 中提取 BobJonJack)。

但是,我很早就遇到了错误。到目前为止,这是我的代码,假设示例 json 保存为sample.json

data = json.load(open('sample.json'))
test = json_normalize(data, record_path=['Content', 'Story'])

导致此错误:

TypeError: string indices must be integers

我怀疑这是因为 Content.Story 实际上是一个包含字典的列表,而不是字典本身。但我不清楚如何真正克服这个问题?

编辑:为了澄清,我最终试图达到实体 ID 的级别(内容 > 故事 > DerivedID > 实体 > Id)。展示 Content.Story 代码示例只是为了说明我现在在解决这个问题时所处的位置。

【问题讨论】:

不应该是[['Content', 'Story']](因为你只有一条记录,Content.Story 如果您创建Minimal, Complete, and Verifiable 示例,您将获得更多更好的答案。尤其要确保输入和预期的测试数据是完整的(不是伪数据),并且可以很容易地剪切和粘贴到编辑器中,以便测试建议的解决方案。 【参考方案1】:

json_normalize(data, record_path=[['Content', 'Story']])

应该可以的。

【讨论】:

谢谢。我如何达到实体 ID 的级别(内容 > 故事 > DerivedID > 实体 > Id)? 这应该是一个新问题:),请在此处创建一个并评论链接。如果这有帮助,请投票并标记为已接受的答案:) 好的。 ***.com/questions/51236576/…

以上是关于json_normalize JSON 文件,列表包含字典(包括示例)的主要内容,如果未能解决你的问题,请参考以下文章

使用 pandas json_normalize 扁平化包含多个嵌套列表的字典列表

Pandas json_normalize 无法在 Python 中使用大型 JSON 文件

使用 pd.json_normalize 展平字典

Pandas json_normalize 不会展平所有嵌套字段

pandas json_normalize KeyError

Pandas json_normalize 返回 KeyError