繁体   English   中英

Pandas 归一化 API 调用 json

[英]Pandas normalize API call 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_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)

但是 output 是:

     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':...

谢谢

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

>>> 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一起使用,然后将 2 组合在一起以创建单个平面表。

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  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM