展平 JSON 嵌套键值对以转换为 csv

问题描述

我有一个非常典型的 json 文件,除了几个项目包含嵌套的标签/值对。数据样本:

{
   "total_count":10000,"count_from":1,"count_to":1000,"contacts":[
      {
         "contact_id":"ABC123","contact_last_name":"Last name","contact_email":[
            {
               "label":"primary","value":"last.first@example.com"
            },{
               "label":"Secondary","value":"first.last@example.com"
            },{
               "label":"personal","value":"last.first@gmail.com"
            }
         ],"research_mail":"last.first@yahoo.com","contact_phone":[
            {
               "label":"Desk/Work","value":"2015555555"
            },{
               "label":"Mobile","value":"2015555556"
            },{
               "label":"Other/Home","value":"2015555557"
            }
         ],"contact_address1":"3rd street","contact_asst_name":"","contact_asst_phone":""
      }
   ]
}

在最终创建 csv 之前,我正在使用 pandas json_normalize 创建一个数据集。

    import json
    import csv
    import pandas as pd

    with open("sourcefilename") as f:  
        data = json.load(f)
    info_df = pd.json_normalize(data,'contacts')

contact_email 和 research_email 值分别作为单独的列返回,以及列内容的原始 JSON 数据。

contact_id,contact_last_name,contact_email,research_mail,etc.

我想要的数据输出列是

contact_id,contact_email_primary,contact_email_secondary,contact_email_personal,etc.

有人可以建议最好的方法吗?如果可能,我更愿意继续使用 pandas 和 json_normalize。

解决方法

一种简单的方法是将列表更改为字典,以便 json_normalize 可以更轻松地应用其魔法:

使用快速重新格式化程序可以提供

def list2dic(inconvenient_list):
    reformatted_dic = {}

    for item in inconvenient_list:
        reformatted_dic[item['label']] = item['value']

    return reformatted_dic

将其应用于 contact_email 和 contact_phone 字段:

for contact in data['contacts']:
    contact['contact_email'] = list2dict(contact['contact_email'])
    contact['contact_phone'] = list2dict(contact['contact_phone'])

现在 json_normalize 应该可以正常工作(将分隔符从 '.' 更改为 '_')

info_df = pd.json_normalize(data,'contacts',sep='_')