将Pandas数据框转换为动态嵌套的JSON

4
我想创建一个类似这样的数据框架:
    employeeId  firstName   lastName    emailAddress    isDependent employeeIdTypeCode  entityCode  sourceCode  roleCode
0   E123456 Andrew  Hoover  hoovera@xyz.com False   001 AE  AHR EMPLR
0   102939485   Andrew  Hoover  hoovera@xyz.com False   002 AE  AHR EMPLR
2   E123458 Celeste Riddick riddickc@xyz.com    True    001 AE  AHR EMPLR
2   354852739   Celeste Riddick riddickc@xyz.com    True    002 AE  AHR EMPLR
1   E123457 Curt    Austin  austinc1@xyz.com    True    001 AE  AHR EMPLR
1   675849302   Curt    Austin  austinc1@xyz.com    True    002 AE  AHR EMPLR
3   E123459 Hazel   Tooley  tooleyh@xyz.com False   001 AE  AHR EMPLR
3   937463528   Hazel   Tooley  tooleyh@xyz.com False   002 AE  AHR EMPLR

每一行,我都希望将其转换为嵌套的JSON格式。因此,对于每个个体,我希望我的JSON看起来像这样,因为我想迭代数据框并将其发布到API。
{  
   "individualInfo":  
      {  
         "individualIdentifier":[  
            {  
               "identityTypeCode":"001",
               "identifierValue":"E123456",
               "profileInfo":{  
                  "firstName":"Andrew",
                  "lastName":"Hoover",
                  "emailAddress":"hoovera@xyz.com"
               }
            },
            {  
               "identityTypeCode":"002",
               "identifierValue":"102939485",
               "profileInfo":{  
                   "firstName":"Andrew",
                  "lastName":"Hoover",
                  "emailAddress":"hoovera@xyz.com"
               }
            }
         ],
         "entityCode":"AE",
         "sourceCode":"AHR",
         "roleCode":"EMPLR"
         "isDependent":False
      }
} 

重要的是,我希望我的JSON生成与数据帧中的Id列无关。因此,如果数据帧中有另一个ID,那么我希望该ID具有另一个具有相同个人资料信息的字典对象。因此,每个个人资料可以带有任意数量的Id
我可以这样编写代码:
j = (result.groupby(['identifierValue','identityTypeCode'], as_index=False).apply(lambda x: x[['firstName','lastName','emailAddress']].to_dict('r')).reset_index().rename(columns={0:'ProfileInfo'}).to_json(orient='records'))

能否在pandas中动态实现类似于此的功能?

非常感谢您的帮助!

关于嵌套的其他问题:

将Pandas数据框转换为嵌套JSON

pandas按组转换为嵌套json

这些问题都没有帮助我,因为我想要将数据框的每个索引转换为一个单独的JSON有效载荷,因为每个个体都将进入我为发布数据到数据库而拥有的API服务。


我已经更新了数据框的分组方式,但是我仍然不知道该怎么做。有人可以帮我吗? - Manas Jani
我可以稍后再试一次;同时,也许您可以重新发布您的问题,并附上许多其他JSON帖子的链接,并解释为什么您的问题与众不同? - Evan
更新了!我已经尝试了几天,但是我根本无法将其格式化到正确的格式。 - Manas Jani
@Evan 有什么进展吗? - Manas Jani
是的,它们可以是相同的!我唯一需要注意的是,在数据框中有多少个“IDs”,就要在“entityIdentifier”列表中生成多少个JSON。 - Manas Jani
显示剩余5条评论
3个回答

5

听起来完成这个的最明智的方式是:

info_dict = df.set_index(['identifierValue', 'identifierValue']).to_dict('index')

那么每次在你的JSON中遇到profileInfo时,你可以使用适当的('identifierValue','identifierValue')键对引用上面的info_dict

我不确定你想要的格式是什么,但这是一个起点。


我也尝试过那种方式,但是我无法按照那种方式对其进行分组,因为我的数据不是以一维格式呈现的。 - Manas Jani

0

虽然不是Pandas的解决方案,但还是可以工作:

从你的result数据框开始

from collections import defaultdict
import json

result = 'your data frame'

dicted = defaultdict(dict)
for r in result.values.tolist():
    identifierValue, firstName, lastName, emailAddress,isDependent,\
    identityTypeCode, entityCode, sourceCode,roleCode = r
    tupled_criteria = (firstName,lastName,emailAddress)
    if dicted[tupled_criteria].get("individualInfo"):
        pass
    else:
        dicted[tupled_criteria]["individualInfo"] = {}

    dicted[tupled_criteria]["individualInfo"]['entityCode'] = entityCode
    dicted[tupled_criteria]["individualInfo"]['soruceCode'] = sourceCode
    dicted[tupled_criteria]["individualInfo"]['roleCode'] = roleCode
    dicted[tupled_criteria]["individualInfo"]['isDependent'] = isDependent
    if dicted[tupled_criteria]["individualInfo"].get("individualIdentifier"):
        pass
    else:
        dicted[tupled_criteria]["individualInfo"]["individualIdentifier"] = []
    dicted[tupled_criteria]["individualInfo"]["individualIdentifier"]\
        .append({"identityTypeCode":identityTypeCode,
                   "identifierValue":identifierValue,
                    "profileInfo":{  
                      "firstName":firstName,
                      "lastName":lastName,
                      "emailAddress":emailAddress}})

for k,v in dicted.items():
    print(k,'\n',json.dumps(v),'\n\n')

0
也许你可以通过迭代分组,然后对该组中的每一行进行另一次迭代。从而创建一个嵌套字典结构:
以下是一种实现方式:
import pandas as pd
df = pd.DataFrame({"entityCode":[1,1,3,3],"sourceCode":[4,4,6,6],'identityTypeCode':[7,8,9,10]})
results = []
for i, sub_df in df.groupby(["entityCode","sourceCode"]):
    entityCode, sourceCode = i
    d = {}
    d["individualInfo"] = {"entityCode":entityCode, "sourceCode":sourceCode}
    sub_result = []
    for _, row in sub_df[["identityTypeCode"]].drop_duplicates().iterrows():
        sub_result.append(row.to_dict())
    d["individualIdentifier"] = sub_result
    results.append(d)
results

它会返回类似于这样的内容:

[{'individualInfo': {'entityCode': 1, 'sourceCode': 4},
  'individualIdentifier': [{'identityTypeCode': 7}, {'identityTypeCode': 8}]},
 {'individualInfo': {'entityCode': 3, 'sourceCode': 6},
  'individualIdentifier': [{'identityTypeCode': 9}, {'identityTypeCode': 10}]}]

之后,您可以将字典转换为JSON格式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接