2017-04-05 75 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块,并将连接更改为“左” –