使用 Pandas 将 json 文件的部分转换为 csv

问题描述

我有一个 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