Доступ Python к вложенным данным JSON и сохранение в dataframe

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я пытаюсь сгенерировать структуру данных из следующего JSON

Данные JSON

 [{"ITEM0":"DescItem0","0":{"ITEM0":"DescItem0","ITEM1":"DescItem1","ITEM2":"DescItem2","ITEM3":"DescItem3"},"1":{"ITEM0":"DescItem0","ITEM1":"DescItem1","ITEM2":"DescItem2","ITEM3":"DescItem3"},"2":{"ITEM0":"DescItem0","ITEM1":"DescItem1","ITEM2":"DescItem2","ITEM3":"DescItem3"},"3":{"ITEM0":"DescItem0","ITEM1":"DescItem1","ITEM2":"DescItem2","ITEM3":"DescItem3"}},{"ITEM0":"DescItem0","0":{"ITEM0":"DescItem0","ITEM1":"DescItem1","ITEM2":"DescItem2","ITEM3":"DescItem3"},"1":{"ITEM0":"DescItem0","ITEM1":"DescItem1","ITEM2":"DescItem2","ITEM3":"DescItem3"},"2":{"ITEM0":"DescItem0","ITEM1":"DescItem1","ITEM2":"DescItem2","ITEM3":"DescItem3"},"3":{"ITEM0":"DescItem0","ITEM1":"DescItem1","ITEM2":"DescItem2","ITEM3":"DescItem3"}},{"ITEM0":"DescItem0","0":{"ITEM0":"DescItem0","ITEM1":"DescItem1","ITEM2":"DescItem2","ITEM3":"DescItem3"},"1":{"ITEM0":"DescItem0","ITEM1":"DescItem1","ITEM2":"DescItem2","ITEM3":"DescItem3"},"2":{"ITEM0":"DescItem0","ITEM1":"DescItem1","ITEM2":"DescItem2","ITEM3":"DescItem3"},"3":{"ITEM0":"DescItem0","ITEM1":"DescItem1","ITEM2":"DescItem2","ITEM3":"DescItem3"}}]
 

структура, которая мне нужна в dataframe
введите описание изображения здесь

Я запускаю этот код, чтобы нормализовать ввод, но он создает много столбцов

 import json
import pandas

with open('.../TestNested.json') as f:
    j1 = json.load(f)
    
Data = pandas.DataFrame(j1)
DataNor = pandas.json_normalize(j1)
DataNor
 

Ответ №1:

  • Основываясь на примере, list оф dicts неправильно отформатирован для использования pd.json_normalize для создания желаемого фрейма данных.
  • Смотрите встроенную нотацию
  • Используется pandas.DataFrame.rename для переименования любых столбцов по мере необходимости
 import pandas as pd

# beginning with j1
j1 = [{'ITEM0': 'DescItem0', '0': {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}, '1': {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}, '2': {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}, '3': {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}}, {'ITEM0': 'DescItem1', '0': {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}, '1': {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}, '2': {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}, '3': {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}}, {'ITEM0': 'DescItem2', '0': {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}, '1': {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}, '2': {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}, '3': {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}}]

# convert j1 into a dataframe
df = pd.DataFrame(j1)

# display(df)
       ITEM0                                                                                         0                                                                                         1                                                                                         2                                                                                         3
0  DescItem0  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}
1  DescItem1  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}
2  DescItem2  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}

# stack the columns of dicts into a single column
# rename column 'ITEM0' to 'ITEM', so there won't be a conflict with 'ITEM0' from inside the dict
dfs = df.set_index('ITEM0').stack().reset_index().drop(columns='level_1').rename(columns={'ITEM0': 'ITEM'})

# display(dfs)
         ITEM                                                                                         0
0   DescItem0  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}
1   DescItem0  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}
2   DescItem0  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}
3   DescItem0  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}
4   DescItem1  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}
5   DescItem1  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}
6   DescItem1  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}
7   DescItem1  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}
8   DescItem2  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}
9   DescItem2  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}
10  DescItem2  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}
11  DescItem2  {'ITEM0': 'DescItem0', 'ITEM1': 'DescItem1', 'ITEM2': 'DescItem2', 'ITEM3': 'DescItem3'}

# expand the dicts into separate columns and rows, and join them to dfs.ITEM
dfe = dfs.drop(columns=[0]).join(pd.DataFrame(dfs[0].tolist()))

# display(dfe)
         ITEM      ITEM0      ITEM1      ITEM2      ITEM3
0   DescItem0  DescItem0  DescItem1  DescItem2  DescItem3
1   DescItem0  DescItem0  DescItem1  DescItem2  DescItem3
2   DescItem0  DescItem0  DescItem1  DescItem2  DescItem3
3   DescItem0  DescItem0  DescItem1  DescItem2  DescItem3
4   DescItem1  DescItem0  DescItem1  DescItem2  DescItem3
5   DescItem1  DescItem0  DescItem1  DescItem2  DescItem3
6   DescItem1  DescItem0  DescItem1  DescItem2  DescItem3
7   DescItem1  DescItem0  DescItem1  DescItem2  DescItem3
8   DescItem2  DescItem0  DescItem1  DescItem2  DescItem3
9   DescItem2  DescItem0  DescItem1  DescItem2  DescItem3
10  DescItem2  DescItem0  DescItem1  DescItem2  DescItem3
11  DescItem2  DescItem0  DescItem1  DescItem2  DescItem3
 

Комментарии:

1. @Cristian Всегда пожалуйста. Рад, что это работает для вас.