Немного неясно, как вы хотите, чтобы вывод выглядел, но я пошел дальше и просто сгладил вложенный json, а затем преобразовал его в массив данных. Оттуда вы можете получить доступ к данным, нарезав / отфильтровав таблицу, записав в CSV-файл или сделав все, что захотите. Но, по сути, каждая строка будет представлять ROLL
с атрибутами и соответствующими баллами по естественным наукам и математике с индексом, начинающимся с 0. Если у некоторых студентов более длинный список в пределах клавиши ACADEMICS
, у вас будут строки с NULL для студентов, у которых не было результатов тестов.
Дано:
jsonData = {
"001": {
"STUDENTTYPE": {
"TYPE": "Boarder"
},
"ACADEMICS": [
{
"SCI": 42,
"MTH": 22
},
{
"SCI": 49,
"MTH": 36
},
{
"SCI": 42,
"MTH": 26
}
],
"ROLL": "001",
"NAME": "Ben",
"CLASS": "XI",
"CLASSTEACHER": "Aka",
"HOME": "Katrasgarh"
},
"002": {
"STUDENTTYPE": {
"TYPE": "DayScholar"
},
"ACADEMICS": [
{
"SCI": 43,
"MTH": 24
},
{
"SCI": 43,
"MTH": 36
},
{
"SCI": 47,
"MTH": 28
}
],
"ROLL": "002",
"NAME": "Bee",
"CLASS": "XI",
"CLASSTEACHER": "Ama",
"HOME": "Kats"
}
}
Код:
import json
import pandas as pd
import re
def flatten_json(y):
out = {}
def flatten(x, name=''):
if type(x) is dict:
for a in x:
flatten(x[a], name + a + '_')
elif type(x) is list:
i = 0
for a in x:
flatten(a, name + str(i) + '_')
i += 1
else:
out[name[:-1]] = x
flatten(y)
return out
flat = flatten_json(jsonData)
results = pd.DataFrame()
columns_list = list(flat.keys())
for item in columns_list:
row_idx = re.findall(r'(\d+)\_', item )[0]
column = item.replace(row_idx + '_', '')
row_idx = int(row_idx)
value = flat[item]
results.loc[row_idx, column] = value
Выход:
print (results.to_string())
STUDENTTYPE_TYPE ACADEMICS_0_SCI ACADEMICS_0_MTH ACADEMICS_1_SCI ACADEMICS_1_MTH ACADEMICS_2_SCI ACADEMICS_2_MTH ROLL NAME CLASS CLASSTEACHER HOME
1 Boarder 42.0 22.0 49.0 36.0 42.0 26.0 001 Ben XI Aka Katrasgarh
2 DayScholar 43.0 24.0 43.0 36.0 47.0 28.0 002 Bee XI Ama Kats