2016-12-14 17 views
3

にJSON私はこのようになり、複雑なJSONファイルがあります。Pythonのパンダ - 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" 
    } 
    } 
} 

をそして、私はこのようになりますデータフレームにそれを有効にする:

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

はこれですパンダでも可能ですか?もしそうなら、私はそれをどうすればできますか?

  • ユーザーとObjの最初の2つの列を削除して、キーの列に残しても構いません。

答えて

2

あなたが最初の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'}}} 

そしてconcatdict comprehensionを使用します。

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 

別の解決策read_jsonではなく、最初のunstackによって再形成し、NaN行を削除必要dropna。最終必要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

あなたはあなたに感謝とても便利です!私は、2行のコードでできている何かのために1時間働いたと想像することはできません。エレガントな...このdfをExcelファイルとして保存する簡単な方法はありますか? – TheDaJon

+0

お受け取りいただきありがとうございます!確かに、['to_excel'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_excel.html) - ' df1.to_excel( 'file.xlsx') 'または'インデックスを削除する必要がある場合、df1.to_excel( 'file.xlsx'、index = False) ' – jezrael

関連する問題