将 JSON 转换为数据框

时间:2021-06-02 21:37:48

标签: python json pandas dataframe

寻找一些指导,必须转换一个看起来像这样的json:

d = {
'dbname' : {
    'table1' : [
        {
            'Name': 'wow',
            'Type': 'str'   
        }, 
        {
            'Name': 'beto',
            'Type': 'int'  
        },
        {
            'Name': 'claro',
            'Type': 'int'    
        }
        ],
    'table2' : [
        {
            'Name': 'date',
            'Type': 'str'   
        }, 
        {
            'Name': 'clear',
            'Type': 'bool'        
        }
        ]
    
},
'dbname2' : {
    'table3' : [
        {
            'Name': 'wow',
            'Type': 'str'
            
        }
        ] 
}

}

进入类似于这样的数据帧:

dataframe

到目前为止,我可以使用以下命令生成一个只有“dbname”的数据框:

df = pd.json_normalize(d,
meta='dbname',
meta_prefix='Parent',
record_path=['dbname', 'table1' ])
df = df.explode('Parentdbname')
df.rename(columns={'Parentdbname':'TableName'}, inplace=True)

输出:

    Name Type TableName
0    wow  str    table1
0    wow  str    table2
1   beto  int    table1
1   beto  int    table2
2  claro  int    table1
2  claro  int    table2

但似乎无法将 dbname2(或进一步的 'dbname's,因为 json 文件更长)进入数据帧(尝试为元数据和记录路径创建键列表),我理想情况下希望包含该列对于这里的 dbname 也是如此,但由于实际 json 文件中的表名都以相应的 db 为前缀,因此不相关。

编辑:首先意识到数据帧输出不正确,只是重复 table1 的值

1 个答案:

答案 0 :(得分:0)

## You can use a for loop here if you have many tables.
dbname = pd.DataFrame(d['dbname']['table1'])
dbname['table'] = 'table1'

dbname3 = pd.DataFrame(d['dbname']['table2'])
dbname3['table'] = 'table2'

dbname2 = pd.DataFrame(d['dbname2']['table3'])
dbname2['table'] = 'table3'

pd.concat([dbname2, dbname, dbname3])

输出:

    Name    Type    table
0   wow     str     table3
0   wow     str     table1
1   beto    int     table1
2   claro   int     table1
0   date    str     table2
1   clear   bool    table2