我要创建如下所示的数据框:
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
}
}
这里重要的是,我希望生成与数据帧上的Id
列无关的JSON。因此,例如,如果数据框上出现另一个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'))
是否有可能在大熊猫中实现这样的动态? 非常感谢您的帮助!
我找不到嵌套的其他问题:
Convert Pandas Dataframe to nested JSON
这些问题都没有帮助我,因为我希望将数据帧的每个索引转换为单独的JSON有效负载,因为每个人都将转至我拥有的api服务,目的是将数据发布到数据库中。
答案 0 :(得分:5)
听起来最可行的方法是:
info_dict = df.set_index(['identifierValue', 'identifierValue']).to_dict('index')
然后每次您在JSON中访问profileInfo
时,都可以使用相应的('identifierValue','identifierValue')`密钥对来引用上面的info_dict
我对所需的格式感到困惑,但这只是一个开始。
答案 1 :(得分:1)
并不是真正的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')
答案 2 :(得分:0)
也许您可以遍历一个组,然后对该组中的每一行进行另一次迭代。因此,创建一个嵌套的字典结构:
这说明了一种处理方法:
<binding protocol="http" bindingInformation="*:50740:127.0.0.1" />
<binding protocol="https" bindingInformation="*:44381:127.0.0.1" />
返回如下内容:
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
之后,您可以将字典转换为json。