Python - преобразование JSON с Pandas в CSV - PullRequest
0 голосов
/ 11 октября 2018

Я работаю с файлом 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

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Эти форматы 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
0 голосов
/ 11 октября 2018

Насколько я вижу, 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")
0 голосов
/ 11 октября 2018

В этом примере берется первое 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...