规范化API调用json

2024-05-29 10:15:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试为每一列规范化这个json API,但我做不到。我在这里尝试了几个关于这个话题的回复,但是我找不到关于我的问题的回复。 问题是因为有些情况下没有电子邮件

这是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_TYPE': 'WORK',
            'VALUE': 'cmgclima@gmail.com',
            'TYPE_ID': 'EMAIL'}]},
         {'ID': '11344',
          'NAME': 'Alcides',
          'LAST_NAME': 'Gonzalez',
          'LEAD_ID': '11006',
          'EMAIL': [{'ID': '42376',
            'VALUE_TYPE': 'WORK',
            '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_TYPE': 'WORK', 'VALUE':...
1   11346   Carlos       Gonzalez    17782  {'ID': '42390', 'VALUE_TYPE': 'WORK', 'VALUE':...
2   11344   Alcides      Gonzalez    11006  {'ID': '42376', 'VALUE_TYPE': 'WORK', 'VALUE':...

谢谢


Tags: namecomidjsondatavalueemailtype
2条回答

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

>>> 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_TYPE': 'WORK',
        'VALUE': 'cmgclima@gmail.com',
        'TYPE_ID': 'EMAIL'}]},
     {'ID': '11344',
      'NAME': 'Alcides',
      'LAST_NAME': 'Gonzalez',
      'LEAD_ID': '11006',
      'EMAIL': [{'ID': '42376',
        'VALUE_TYPE': 'WORK',
        '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',
      '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_TYPE': 'WORK',
        'VALUE': 'cmgclima@gmail.com',
        'TYPE_ID': 'EMAIL'}},
     {'ID': '11344',
      'NAME': 'Alcides',
      'LAST_NAME': 'Gonzalez',
      'LEAD_ID': '11006',
      'EMAIL': {'ID': '42376',
        'VALUE_TYPE': 'WORK',
        'VALUE': 'makogonzalez@gmail.com',
        '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  

相关问题 更多 >

    热门问题