【问题标题】:Converting selected JSON tags to Pandas dataframe将选定的 JSON 标签转换为 Pandas 数据框
【发布时间】:2020-03-08 20:06:04
【问题描述】:

我有一个类似 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。这个“历史”再次有一个“键”,即timestamp,以及一个包含挑战详细信息challengeincreasetotal 的值。 我想将其转换为看起来像的熊猫数据框 -

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 扁平化为不同的列。

【问题讨论】:

  • 您想要的结果被大大截断了。请对其进行编辑,以便人们了解您的目标。或者更好地描述您想要的列名/结构。
  • Pandas json_normalize 不会神奇地给出你需要的结构。您需要重组您的输入 json,以便数组中的每个元素代表一行,即在您的情况下为 timestamp
  • 我同意@FatihAkici。至少我们需要正确描述数据的转换。
  • 已编辑。我希望它现在更具描述性!
  • 除了json_normalize()之外,你有没有尝试过?

标签: python json pandas dataframe


【解决方案1】:

假设你的数据名称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
])

【讨论】:

  • 它是嵌套列表理解。对于每个 data 中的 dt,v 在每个 d 中的每个项目,您只提取数据框中所需的信息。
  • @thushv89 给出解释。
猜你喜欢
  • 2019-05-14
  • 2019-07-01
  • 2021-12-13
  • 2020-03-13
  • 2020-10-31
  • 2020-09-02
  • 2020-02-29
  • 2017-03-21
  • 2021-03-01
相关资源
最近更新 更多