将选定的JSON标签转换为Pandas数据帧

3

我有一个类似于JSON的数据 -

[
  {
    "key": "033298fd-f792-4343-b145-852e9cdb680a",
    "value": {
      "total": 15452,
      "history": {
        "2019-11-05T23:05:14.53878Z": {
          "challenge": "readrules",
          "increase": 1,
          "total": 1
        },
        "2019-11-05T23:17:48.849886Z": {
          "challenge": "looksthesame",
          "increase": 100,
          "total": 1601
        }
     },
  ...
  ...
  ...
  }

 .... 2nd 'key' ....
}

每个'键'后面跟着一个具有 history 的 'value'。'history' 再次具有一个'键',它是 timestamp,并具有挑战细节 challengeincreasetotal 的值。

我想将其转换为 Pandas 数据帧,看起来类似于 -

key                                              timestamp                   challenge       increase   total
033298fd-f792-4343-b145-852e9cdb680a    2019-11-05T23:05:14.53878Z      readrules          1         1 
033298fd-f792-4343-b145-852e9cdb680a    2019-11-05T23:17:48.84986Z      looksthesame      100       101

我试图使用 -

pd.io.json.json_normalize(json)

但这只是将整个 JSON 扁平化为不同的列。

1
您期望的结果被大幅截断了。请编辑它,以便人们能够理解您的目标。或者更好地描述您想要的列名/结构。 - FatihAkici
Pandas的json_normalize并不能神奇地给你所需的结构。你需要重新构造输入的JSON,使数组中的每个元素都代表一行,例如在你的情况下是timestamp - Vishnudev Krishnadas
1
我同意@FatihAkici的观点。至少我们需要对数据转换进行适当的描述。 - AMC
已编辑。希望现在更具描述性! - harry04
除了使用“json_normalize()”,你尝试过其他的方法吗? - AMC
不!对于JSON转换为数据框并不是很有经验。 - harry04
1个回答

3
假设你的数据名称为data,请尝试:
pd.concat([
    pd.io.json.json_normalize([
        {
            "key": d["key"], 
            "timestamp": t, 
            "challenge": v['challenge'], 
            "increase": v['increase'], 
            "total": v['increase']
        } 
        for t,v in d['value']['history'].items() 
    ]) 
    for d in data
])

1
这是嵌套的列表推导式。对于data中的每个项目d和每个d中的tv,您只提取数据框中所需的信息。 - thushv89
@thushv89 给出了解释。 - Lambda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接