问题描述
我有一个 JSON 文件,我需要从中将特定数组转换为 CSV,然后还包含数组外部的值。这是我的示例 JSON:
{
"activities" : [
{
"act_id" : "123456","act_employee_logged" : {
"emp_id" : "123","emp_code" : "ABC123","emp_name" : "First Last Name",},"act_type" : "ActivityType","act_external_attendees" : [
{
"contact_id" : "Guest789","contact_name" : "First Last Name","contact_email" : "last.first@example.com","contact_phone" : "2105555555"
},{
"contact_id" : "Guest790","contact_name" : "First Last Name 1","contact_email" : "last.first1@example.com","contact_phone" : "2105555556"
}
],"act_internal_attendees" : [
{
"att_id" : "123","att_code" : "ABC123","att_name" : "First Last Name","att_email" : "last.first@example.com"
},{
"att_id" : "124","att_code" : "ABC124","att_name" : "First Last Name 1","att_email" : "last.first1@example.com"
}
]
}
]
}
我需要将 act_external_attendees 转换为数据框,然后转换为 CSV。我已经成功地做到了这一点,这是读取文件并创建我的数据框的代码部分:
import json
import csv
import pandas as pd
with open("/filepath/interaction_response.json") as f: #####
d = json.load(f)
ext_att = pd.json_normalize(data=d['activities'],record_path='act_external_attendees',Meta=['contact_id','contact_name','contact_email','contact_phone'],errors='ignore',record_prefix = '_')
让我头疼的部分是我需要将 act_id
值作为列包含在我的数据框和 CSV 的每一行中,到目前为止我还没有找到实现这一点的方法。任何建议表示赞赏。
解决方法
这可能有帮助
加载库
import json
import csv
import pandas as pd
读取文件
with open("/filepath/interaction_response.json") as f:
d = json.load(f)
创建辅助结构
my_list = []
for sublist in myj['activities']:
act_id = sublist['act_id']
for val in sublist['act_external_attendees']:
val.update({'act_id': act_id})
my_list.append(val)
结果是
print(my_list)
[{'contact_id': 'Guest789','contact_name': 'First Last Name','contact_email': 'last.first@example.com','contact_phone': '2105555555','act_id': '123456'},{'contact_id': 'Guest790','contact_name': 'First Last Name 1','contact_email': 'last.first1@example.com','contact_phone': '2105555556','act_id': '123456'}]
创建数据框
df = pd.DataFrame(my_list)
print(df)
contact_id contact_name contact_email contact_phone act_id
0 Guest789 First Last Name last.first@example.com 2105555555 123456
1 Guest790 First Last Name 1 last.first1@example.com 2105555556 123456