2017-05-23 1 views
0

I ont des données de json qui peut être représenté par la structure d'arbre avec chaque noeud comporte quatre attributs: name, id, child, parentid(pid) (par noeud feuille, il ne dispose que de trois attributs: id, pid, name).Comment convertir une donnée json tree en dataframe en Python?

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

Je veux le convertir en une trame de données avec trois colonnes comme:

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

Avec les données de toutes les couches en trois attributs (id,pid,name)

J'ai essayé pandas.read_json avec les paramètres par défaut, mais il semble qu'il ne peut pas itérer les couches entières et la sortie est juste comme:

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

Je me demande s'il existe des méthodes simples pour résoudre ce problème avec ou sans pandas.

+0

Essayez d'utiliser le ([ 'json_normalize()'] http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.json.json_normalize.html?highlight=json_normalize#pandas .io.json.json_normalize) ou, en fonction de la complexité de vos données, jetez un coup d'œil à la bibliothèque 'flatten' (https://github.com/amirziai/flatten) ([blog post] (https: //medium.com/@amirziai/flattening-json-objects-in-python-f5343c794b10)). –

+0

Merci pour votre réponse. Il semble que 'json_normalize()' ne fonctionne pas pour moi (peut-être que je mets le mauvais paramètre) et 'flatten' renvoie juste trop de colonnes. – natsuapo

Répondre

0

J'utilise une récursion pour le remplir et j'ai prouvé que cela fonctionne sur mes données.

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)