Python-使用Pandas将JSON转换为CSV

时间:2018-10-10 21:01:41

标签: python json pandas csv

我正在使用具有这样的嵌套对象的JSON文件。 数据分为列和行。

列数据应位于单独的列中,并且在row对象中,其内部的数字应与相应的列相关联,例如:

  • 深度: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

3 个答案:

答案 0 :(得分:1)

这些json格式最终被嵌套为字典,所以我这样处理:

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

答案 1 :(得分:1)

据我所知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")

答案 2 :(得分:0)

此示例采用第一个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')

如果您希望每个aggs有一个以上的表,则只需循环json_text