#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 Всегда пожалуйста. Рад, что это работает для вас.