Я работаю с файлом JSON, у которого есть вложенные объекты. Данные разделяются на столбцы и строки.
Данные столбцов должны быть в отдельных столбцах и в объекте rows, номера внутри него должны быть связаны с соответствующими столбцами, например:
До сих пор мне не удалось преобразовать файл в этот формат, как я могу это сделать?
{
"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
Эти 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
Насколько я вижу, 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")
json.loads
Этот пример принимает первое значение 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
dict
для json_text
а не строку, как предполагает ваш вопрос. просто замените json.loads(json_text)
только на json_text