【问题标题】:Python - JSON convertion with Pandas to CSVPython - 使用 Pandas 将 JSON 转换为 CSV
【发布时间】:2019-03-15 20:48:20
【问题描述】:

我正在处理一个包含这样的嵌套对象的 JSON 文件。 数据分为列和行。

列数据应位于单独的列和行对象中,其中的数字应与相应的列相关联,如下所示:

  • 深度:1、2、3、4、5
  • Page_Count:1、661、16773 等

到目前为止,我还不能将文件转换成那种格式,我该怎么做呢?

 {
      "aggs": [
        {
          "cols": [
            "depth",
            "page_count"
          ],
          "rows": [
            [
              1,
              1
            ],
            [
              2,
              661
            ],
            [
              3,
              16773
            ],
            [
              4,
              7078
            ],
            [
              5,
              221
            ]
          ]
        }
      ]
    }

最终产品应如下所示:

    depth | page_count
    -----:|----------:
        1 |          1
        2 |        661
        3 |      16773
        4 |       7078
        5 |        221

【问题讨论】:

  • 您尝试了什么,发生了什么?另外请您尝试澄清您对数据如何排列以及您希望如何排列的描述。
  • “cols”中的数据是 CSV 文件中的各个列。 “行”内的数据被分配给列。这是配置:Depth 1 2 3 4 5 Page_Count 1, 661, 16773
  • @Stuart 我已经用我想要完成的图像更新了帖子的最后一行

标签: python json pandas csv


【解决方案1】:

这些 json 格式最终是嵌套的 dicts,所以我是这样处理的:

import pandas as pd
import os

x =  {
  "aggs": [
    {
      "cols": [
        "depth",
        "page_count"
      ],
      "rows": [
        [
          1,
          1
        ],
        [
          2,
          661
        ],
        [
          3,
          16773
        ],
        [
          4,
          7078
        ],
        [
          5,
          221
        ]
      ]
    }
  ]
}

dfrows = []
dfcolumns = []
for y,z in x.items(): # x.items() is a nested dict with aggs is outer key x and z is list as the value of aggs:
    for a in z: # a accesses the inner dict in the list
        for j,k in a.items(): # key, value of rows and cols in inner dict
            if j == 'rows':
                dfrows.append(k) # make list of list of row values
            if j == 'cols':
                dfcolumns.append(k) # make list of list of column names

rows_flat_list = [item for x in dfrows for item in x] # flatten out list
columns_flat_list = [item for x in dfcolumns for item in x] # flatten out list

dfJson = pd.DataFrame(data = rows_flat_list, columns= columns_flat_list) # create df

dfJson.to_csv('./dfJson.csv', index=False) # write to csv

输出的 csv 文件看起来像(或者如果你用 excel 打开它是一个 excelfile 格式):

depth,page_count
1,1
2,661
3,16773
4,7078
5,221

【讨论】:

  • 我不知道为什么,但是当我尝试这个解决方案时,我得到 dfJson not defined!
  • 如果你直接复制了,也许再试一次。在 for 循环内部有一个我刚刚修复的缩进问题(一个缩进比它应该少一个空格)。我刚刚再次运行代码,它对我来说工作正常!
  • 我很想弄清楚这一点并将其标记为正确答案,因为我对此有很多问题,而您的答案是迄今为止最好的答案!
  • 错误似乎在这里: if j == 'cols': dfJson.columns = k # make cols columns names dfJson.to_csv('./Desktop/dfJson.csv', index=False )
  • 如果你在最后一个 if 语句中 print(dfJson) 会发生什么,比如 if j == 'cols': dfJson.columns = k print(dfJson)
【解决方案2】:

据我所知pandas.read_json 无法处理这种格式的数据,因此您必须先使用json.loads(或文件中的json.load)读取它。

import pandas as pd
import json
data = """{"aggs": [{"rows": [[1, 1], [2, 661], [3, 16773], [4, 7078], 
        [5, 221]], "cols": ["depth", "page_count"]}]}"""

main_data = json.loads(data)["aggs"][0]
df = pd.DataFrame(columns=main_data['cols'], data=main_data['rows'])
df.to_csv("my_file.csv")

【讨论】:

  • 您的解决方案完美运行,但我的 File TypeError 出现此错误:JSON 对象必须是 str、bytes 或 bytearray,而不是 dict
  • 那么你的数据可能是一个开始的字典?所以不需要json.loads
【解决方案3】:

本示例采用第一个aggs 值,并将其转换为csv

import pandas as pd
import json
data = json.loads(json_text)['aggs'][0]
pd.DataFrame(data['rows'], columns = data['cols']).to_csv('output.csv')

如果您希望每个 json_text 有多个表,只需循环遍历 aggs

【讨论】:

  • 您的解决方案完美运行,但我的 File TypeError 出现此错误:JSON 对象必须是 str、bytes 或 bytearray,而不是 dict
  • 您使用dict 表示json_text,而不是您的问题所暗示的字符串。只需将 json.loads(json_text) 替换为 json_text
猜你喜欢
  • 2017-09-12
  • 2021-04-26
  • 2017-06-10
  • 2021-12-28
  • 2018-11-06
  • 2022-01-26
  • 1970-01-01
  • 2018-09-16
  • 2017-12-17
相关资源
最近更新 更多