2017-04-05 73 views
0

我很新到Python(來自R對剛剛遷移),並想列表轉換爲大熊貓數據幀。在研究了這個話題之後,我發現了很多答案,但沒有一個能夠達到預期的結果。從API轉換JSON(包括對象的數組),以大熊貓數據幀

的數據來源於和具有以下結構:

[ 
    { 
     "id": "ID_ONE", 
     "name": "NAME_ONE", 
     "source": { 
      "id": "AB", 
      "value": "source AB" 
     }, 
     "topics": [ 
      { 
       "id": "11", 
       "value": "topic 11 " 
      }, 
      { 
       "id": "12", 
       "value": "topic 12 " 
      } 
     ] 
    }, 
    { 
     "id": "ID_TWO", 
     "name": "NAME_TWO", 
     "source": { 
      "id": "BC", 
      "value": "source BC" 
     }, 
     "topics": [ 
      { 
       "id": "12", 
       "value": "topic 12 " 
      } 
     ] 
    } 
] 

使用requestsjson_normalize後,我結束了一個漂亮的數據幀,但「主題」(即字典列表)保持一列表系列。

你有什麼建議如何處理這個名單?

我也不管你認爲其他數據結構來處理Python這樣的輸出(來自R對未來,我只是覺得用DataFrames和列表舒適)更有益欣賞任何意見或建議。

+0

這可能幫助https://medium.com/@amirziai/flattening-json-objects-in-python-f5343c794b10 –

+0

@EzerK,完美,謝謝!這正是我期待的! – georg23

回答

0

我假設你得到了遠

import pandas as pd 
from pandas.io.json import json_normalize 
df=json_normalize(CopyPastedFromQuestion) 

您可以在一個循環中再次連載df.topics。但是,您需要編碼您的結果應該如何。一個可能的解決方案是

all_topics=pd.DataFrame() 
for i,row in df.iterrows(): 
    try: 
     topics=json_normalize(df['topics'].values[i]) 
     topics['parent_id']=row['id'] 
     all_topics=all_topics.append(topics) 
    except: 
     pass 
final=pd.merge(df,all_topics, left_on='id', right_on='parent_id', how='left') 
+0

感謝您的例子!只要列表中的「主題」不是空的,它就會運行良好。你有想法如何捕捉這個錯誤? – georg23

+0

我編輯了這個例子;這將是一個猜測,因爲我沒有數據樣本。添加了try ... except塊,並將連接更改爲「左」 –