Python访问嵌套的JSON数据并保存到dataframe中

2024-09-30 14:37:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从以下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"}}]

数据帧中我需要的结构 enter image description here

我运行这段代码来规范化输入,但它会创建很多列

import json
import pandas

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

Tags: 数据importjsonpandasitem0j1item1item2
1条回答
网友
1楼 · 发布于 2024-09-30 14:37:40
  • 根据示例,dictslist未正确格式化,无法使用pd.json_normalize生成所需的数据帧
  • 请参阅内联表示法
  • 根据需要使用^{}重命名任何列
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

相关问题 更多 >