Pandas 规范化 API 调用 json

问题描述

我试图为每一列标准化这个 json API,但我不能。我从这里尝试了几个针对此主题的回复,但找不到针对我的问题的回复。 问题是因为有些情况没有EMAIL

这是json数据:

    data =[{'ID': '11348','NAME': 'Yanara','LAST_NAME': 'Araneda','LEAD_ID': '17772','EMAIL': [{'ID': '42400','VALUE_TYPE': 'WORK','VALUE': 'yanara.araneda.moraga@gmail.com','TYPE_ID': 'EMAIL'}]},{'ID': '11346','NAME': 'Carlos ','LAST_NAME': 'Gonzalez ','LEAD_ID': '17782','EMAIL': [{'ID': '42390','VALUE': 'cmgclima@gmail.com',{'ID': '11344','NAME': 'Alcides','LAST_NAME': 'Gonzalez','LEAD_ID': '11006','EMAIL': [{'ID': '42376','VALUE': 'makogonzalez@gmail.com','TYPE_ID': 'EMAIL'}]}
         {'ID': '9752','NAME': 'Oriana','LAST_NAME': 'Mejias','LEAD_ID': None}]]

我试过了

df = pd.json_normalize(data)

但输出是:

     ID      NAME       LAST_NAME   LEAD_ID                   EMAIL
0   11348   Yanara       Araneda     17772  {'ID': '42400','VALUE':...
1   11346   Carlos       Gonzalez    17782  {'ID': '42390','VALUE':...
2   11344   Alcides      Gonzalez    11006  {'ID': '42376','VALUE':...

谢谢

解决方法

不太清楚您想要的输出是什么,但这可能有帮助吗?

>>> pd.json_normalize(data,'EMAIL',['NAME','LAST_NAME','LEAD_ID'])
      ID VALUE_TYPE                            VALUE TYPE_ID     NAME  LAST_NAME LEAD_ID
0  42400       WORK  yanara.araneda.moraga@gmail.com   EMAIL   Yanara    Araneda   17772
1  42390       WORK               cmgclima@gmail.com   EMAIL  Carlos   Gonzalez    17782
2  42376       WORK           makogonzalez@gmail.com   EMAIL  Alcides   Gonzalez   11006
,

问题是您的 'EMAIL' 字段具有嵌套列表而不是字典。如果是这样,pd.json_normalize 仍然能够将其展平为嵌套的 json。

对于这种情况,您可以将 pd.json_normalize 与不同的 record_path 一起使用,然后将两者组合在一起以创建单个平面表。

data =[{'ID': '11348','NAME': 'Yanara','LAST_NAME': 'Araneda','LEAD_ID': '17772','EMAIL': [{'ID': '42400','VALUE_TYPE': 'WORK','VALUE': 'yanara.araneda.moraga@gmail.com','TYPE_ID': 'EMAIL'}]},{'ID': '11346','NAME': 'Carlos ','LAST_NAME': 'Gonzalez ','LEAD_ID': '17782','EMAIL': [{'ID': '42390','VALUE': 'cmgclima@gmail.com',{'ID': '11344','NAME': 'Alcides','LAST_NAME': 'Gonzalez','LEAD_ID': '11006','EMAIL': [{'ID': '42376','VALUE': 'makogonzalez@gmail.com','TYPE_ID': 'EMAIL'}]}]

p1 = pd.json_normalize(data).drop('EMAIL',axis=1)
p2 = pd.json_normalize(data,record_path='EMAIL',record_prefix='EMAIL.')

df = p1.merge(p2,left_index=True,right_index=True)
print(df)
      ID     NAME  LAST_NAME LEAD_ID EMAIL.ID EMAIL.VALUE_TYPE  \
0  11348   Yanara    Araneda   17772    42400             WORK   
1  11346  Carlos   Gonzalez    17782    42390             WORK   
2  11344  Alcides   Gonzalez   11006    42376             WORK   

                       EMAIL.VALUE EMAIL.TYPE_ID  
0  yanara.araneda.moraga@gmail.com         EMAIL  
1               cmgclima@gmail.com         EMAIL  
2           makogonzalez@gmail.com         EMAIL  

如果您的数据没有 'EMAIL' 的列表值,那么获取您需要的内容将非常容易。只有 pd.json_normalize(data) 就足够了。 -

data =[{'ID': '11348','EMAIL': {'ID': '42400','TYPE_ID': 'EMAIL'}},'EMAIL': {'ID': '42390','EMAIL': {'ID': '42376','TYPE_ID': 'EMAIL'}}]

print(pd.json_normalize(data))
      ID     NAME  LAST_NAME LEAD_ID EMAIL.ID EMAIL.VALUE_TYPE  \
0  11348   Yanara    Araneda   17772    42400             WORK   
1  11346  Carlos   Gonzalez    17782    42390             WORK   
2  11344  Alcides   Gonzalez   11006    42376             WORK   

                       EMAIL.VALUE EMAIL.TYPE_ID  
0  yanara.araneda.moraga@gmail.com         EMAIL  
1               cmgclima@gmail.com         EMAIL  
2           makogonzalez@gmail.com         EMAIL  

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...