【问题标题】:Pandas normalize API call jsonPandas 规范化 API 调用 json
【发布时间】:2021-04-26 03:13:53
【问题描述】:

我试图为每一列规范化这个 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)

但是输出是:

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

谢谢

【问题讨论】:

  • 你想达到什么目的? json 的期望输出是什么?
  • JSON 中的 EMAIL 标签有一个嵌入列表。这可能意味着它将为未来数据集中的每个 ID 记录提供多个列表元素。根据您希望此输出的方式,您可能希望考虑将列表内容导出到一个单独的数据框,并将 ID 作为您可以加入的内容。

标签: python json pandas normalize


【解决方案1】:

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

>>> 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

【讨论】:

  • 嗨,谢谢。我检查了来自 API 的数据,有些情况下没有“EMAIL”。因此我得到一个错误。 (KeyError: 'EMAIL') 有些情况是这样的 {'ID': '9752', 'NAME': 'Oriana', 'LAST_NAME': 'Mejias', 'LEAD_ID': None}
【解决方案2】:

问题是您的'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  

【讨论】:

  • 您好,感谢您的回复。当我尝试制作 p2 时出现错误“KeyError:'EMAIL'”
  • 您的数据是否在每条记录中都有“EMAIL”字段?
  • 我正在复制粘贴您在顶部发布的相同数据,它对我来说运行良好。您可以在上面发布的示例数据上对其进行测试吗?
  • 你能复制我第一部分的整个代码块并按原样运行吗?
  • 您好,我检查了 API 的数据,有些情况下没有 'EMAIL'。因此我得到一个错误。 (KeyError: 'EMAIL') 有些情况是这样的 {'ID': '9752', 'NAME': 'Oriana', 'LAST_NAME': 'Mejias', 'LEAD_ID': None}
猜你喜欢
  • 2020-12-11
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2016-02-04
  • 2022-07-12
  • 2019-12-22
  • 2012-08-21
相关资源
最近更新 更多