2017-05-23 64 views
0

我有可以表示为树结构与每个节点具有四个属性的JSON数据:nameidchildparentid(pid)(叶节点它只有三个属性:idpidname)。如何在Python中将json树数据转换为数据框?

{'child': [{'id': '','child':[{'id': '','child':['name':'','id':'','pid':''], 'name': '', 'pid':''}], 'name': '', 'pid': ''}],'name':'','pid':'','id':''} 

我想它有三列像转换成数据帧:

id, pid, name 
1 .., ..., .... 
2 .., ..., .... 

随着来自各个层面的数据在三个属性(id,pid,name)

我试图pandas.read_json使用默认参数,但它似乎不能迭代整个图层并且输出如下:

id, pid, name, child 
1 .., ..., ...., {'id':'','pid': '','name': '', 'child':[{...}]} 
2 .., ..., ...., {'id':'','pid': '','name': '', 'child':[{...}]} 

我想知道是否有一些简单的方法来解决这个问题,有或没有pandas

+0

尝试['json_normalize()'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.json.json_normalize.html?highlight=json_normalize#pandas .io.json.json_normalize)函数,或者根据数据的复杂性,查看'flatten' [library](https://github.com/amirziai/flatten)([blog blog])(https: //medium.com/@amirziai/flattening-json-objects-in-python-f5343c794b10))。 –

+0

谢谢你的回复。看起来'json_normalize()'不适用于我(也许我设置了错误的参数)并且'flatten'只返回太多的列。 – natsuapo

回答

0

我使用递归来实现它,我已经证明它对我的数据有效。使用

import json 
import pandas as pd 


def test_iterate(df): 
    global total_data 
    total_data = total_data.append(df[['id','pid','name']]) 
    try: 
     df['child'].apply(lambda x:test_iterate(pd.DataFrame(x))) 
    except Exception as inst: 
     print(inst) 
     pass 

if __name__ == '__main__': 
    total_data = pd.DataFrame() 
    loaddata = json.load(open('test.json')) 
    df = pd.DataFrame(loaddata) 
    test_iterate(df) 
    total_data.to_csv('test.csv',index=None) 
相关问题