问题描述
我试图为每一列标准化这个 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