2016-12-14 2 views
3

Ich habe eine komplizierte JSON-Datei, die wie folgt aussieht:Python Pandas - Json zu Dataframe

{ 
    "User A" : { 
    "Obj1" : { 
     "key1": "val1", 
     "key2": "val2", 
     "key3": "val3", 
    } 
    "Obj2" : { 
     "key1": "val1", 
     "key2": "val2", 
     "key3": "val3" 
    } 
    } 
    "User B" : { 
    "Obj1" : { 
     "key1": "val1", 
     "key2": "val2", 
     "key3": "val3", 
     "key4": "val4" 
    } 
    } 
} 

Und ich will sie in einen Datenrahmen verwandeln, die wie folgt aussieht:

   key1 key2 key3 key4 
User A Obj1 val1 val2 val3 NaN 
     Obj2 val1 val2 val3 NaN 
User B Obj1 val1 val2 val3 val4 

dies ist möglich mit Pandas? Wenn ja, wie kann ich es schaffen?

  • Wenn es einfacher ist, ich habe nichts dagegen, die ersten beiden Spalten der Benutzer zu entfernen und das Obj, und nur mit den Spalten der Tasten bleiben.

Antwort

2

können Sie lesen erste Datei auf dict:

with open('file.json') as data_file:  
    dd = json.load(data_file) 

print(dd) 
{'User B': {'Obj1': {'key2': 'val2', 'key4': 'val4', 'key1': 'val1', 'key3': 'val3'}}, 
'User A': {'Obj1': {'key2': 'val2', 'key1': 'val1', 'key3': 'val3'}, 
'Obj2': {'key2': 'val2', 'key1': 'val1', 'key3': 'val3'}}} 

Und dann verwenden dict comprehension mit concat:

df = pd.concat({key:pd.DataFrame(dd[key]).T for key in dd.keys()}) 
print (df) 
      key1 key2 key3 key4 
User A Obj1 val1 val2 val3 NaN 
     Obj2 val1 val2 val3 NaN 
User B Obj1 val1 val2 val3 val4 

Eine andere Lösung mit read_json, aber zuerst durch unstack umformen müssen, und entfernen Sie NaN Reihen von dropna. Letzte Notwendigkeit DataFrame.from_records:

df = pd.read_json('file.json').unstack().dropna() 
print (df) 
User A Obj1  {'key2': 'val2', 'key1': 'val1', 'key3': 'val3'} 
     Obj2  {'key2': 'val2', 'key1': 'val1', 'key3': 'val3'} 
User B Obj1 {'key2': 'val2', 'key4': 'val4', 'key1': 'val1... 
dtype: object 

df1 = pd.DataFrame.from_records(df.values.tolist()) 
print (df1) 
    key1 key2 key3 key4 
0 val1 val2 val3 NaN 
1 val1 val2 val3 NaN 
2 val1 val2 val3 val4 

df1 = pd.DataFrame.from_records(df.values.tolist(), index = df.index) 
print (df1) 
      key1 key2 key3 key4 
User A Obj1 val1 val2 val3 NaN 
     Obj2 val1 val2 val3 NaN 
User B Obj1 val1 val2 val3 val4 
+0

Sie so hilfreich sind danke! Ich kann mir nicht vorstellen, dass ich eine Stunde für etwas gearbeitet habe, das mit zwei Codezeilen erledigt werden kann, also elegant ... Gibt es eine einfache Möglichkeit, dieses df auch als Excel-Datei zu speichern? – TheDaJon

+0

Danke für die Annahme! Sicher, benutze ['to_excel'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_excel.html) -' df1.to_excel ('file.xlsx') 'oder' df1.to_excel ('file.xlsx', index = False) 'falls nötig den Index entfernen. – jezrael