Python - преобразование JSON с Pandas в CSV

1

Я работаю с файлом JSON, у которого есть вложенные объекты. Данные разделяются на столбцы и строки.

Данные столбцов должны быть в отдельных столбцах и в объекте rows, номера внутри него должны быть связаны с соответствующими столбцами, например:

  • Глубина: 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
  • 1
    Что вы пробовали и что случилось? Также, пожалуйста, попробуйте уточнить ваше описание того, как расположены данные и как вы хотите, чтобы они были расположены.
  • 0
    Данные внутри столбцов - это отдельные столбцы в файле CSV. Данные внутри «строк» присваиваются столбцам. Это конфигурация: Глубина 1 2 3 4 5 Page_Count 1, 661, 16773
Показать ещё 1 комментарий
Теги:
pandas
csv

3 ответа

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
  • 0
    Я не знаю почему, но я получаю dfJson не определить, когда я пытаюсь это решение!
  • 0
    Если вы скопировали его напрямую, возможно, попробуйте снова. Внутри цикла for была проблема с отступами, которую я только что исправил (один отступ имел на один пробел меньше, чем должен). Я просто снова запустил код, и он работает нормально для меня!
Показать ещё 13 комментариев
1

Насколько я вижу, pandas.read_json не может обрабатывать данные в этом формате, поэтому json.loads вы должны прочитать его с помощью 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
    Ваше решение работает отлично, но я получаю эту ошибку с моей File TypeError: объект JSON должен быть str, байтами или bytearray, а не dict
  • 0
    Тогда ваши данные, вероятно, диктовать для начала? Так что нет необходимости в json.loads
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

  • 0
    Ваше решение работает отлично, но я получаю эту ошибку с моей File TypeError: объект JSON должен быть str, байтами или bytearray, а не dict
  • 0
    Вы использовали dict для json_text а не строку, как предполагает ваш вопрос. просто замените json.loads(json_text) только на json_text

Ещё вопросы

Сообщество Overcoder
Наверх
Меню