展平 JSON 嵌套键值对以转换为 csv
Flatten JSON nested key value pairs for conversion to csv
我有一个非常典型的 json 文件,除了几个项目包含嵌套的 label/value 对。数据样本:
{
"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 值每个 return 作为单独的列,列内容的原始 JSON 数据。
contact_id,contact_last_name,contact_email,research_mail, etc.
我希望该数据的输出列是
contact_id,contact_last_name,contact_email_primary,contact_email_secondary,contact_email_personal,research_mail, 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='_')
我有一个非常典型的 json 文件,除了几个项目包含嵌套的 label/value 对。数据样本:
{
"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 值每个 return 作为单独的列,列内容的原始 JSON 数据。
contact_id,contact_last_name,contact_email,research_mail, etc.
我希望该数据的输出列是
contact_id,contact_last_name,contact_email_primary,contact_email_secondary,contact_email_personal,research_mail, 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='_')