如何使用python生成特定的嵌套JSON
无法使用Python在JSON中生成特定的组和子组 我正在尝试使用Python生成嵌套JSON。但是,不知何故,我无法理解子分组是如何工作的,或者更确切地说,我可以生成它。不知道如何先打包子组,然后再打包 python或pandas或任何相关的python包中是否有任何内置函数可以在不编写大量代码的情况下执行相同的操作 我写的如下:如何使用python生成特定的嵌套JSON,python,json,nested,Python,Json,Nested,无法使用Python在JSON中生成特定的组和子组 我正在尝试使用Python生成嵌套JSON。但是,不知何故,我无法理解子分组是如何工作的,或者更确切地说,我可以生成它。不知道如何先打包子组,然后再打包 python或pandas或任何相关的python包中是否有任何内置函数可以在不编写大量代码的情况下执行相同的操作 我写的如下: j = (df.groupby(['empno', 'work_id'], as_index=False) .apply(lambda x: x[
j = (df.groupby(['empno', 'work_id'], as_index=False)
.apply(lambda x: x[['status_id', 'type', 'languageId', 'language',
'email', 'game_name', 'experience_level', 'CellNo'
]].to_dict('r'))
.reset_index()
.rename(columns={0: 'workPostDetails'})
.to_json(orient='records'))
print("JSON::")
print(j)
样本数据:
empno work_id status_id type languageId Language send_by recived_by game_name experience_level
----- ---------- ---------- ----- ----------- --------- --------- ---------- ------------- -----------------
0017 X123 2101 email 1 All a@abc.com b@xyz.com C++ Expert
0017 X123 2103 phone 1 All +1 9282828282 +1 9383838383 A++ Intermediate
预期的JSON:
{
"empno": "0017",
"work_id": "X123",
"workPostDetails": {
"workDetails": [
{
"status_id": "2101",
"type": "email",
"languageId": "1",
"language": "All-Read-Write",
"send_by": {
"email": "a@abc.com"
},
"recived_by": [
{
"email": "b@xyz.com"
}
],
"skillDetails": [
{
"game_name": "EA Sports",
"experience_level": "Expert"
}
]
},
{
"status_id": "2103",
"type": "sms",
"languageId": "2",
"language": "All-Read",
"send_by": {
"CellNo": "+1 9282828282"
},
"recived_by": [
{
"CellNo": "+1 9383838383"
}
],
"skillDetails": [
{
"game_name": "Candy Crush",
"experience_level": "Intermediate"
}
]
}
]
}
}
您可以首先通过调整列来准备数据帧,然后迭代GroupBy对象。它将提供:
# act on a copy to preserve original data
df2 = df.copy()
# prepare columns
df2[['send_by', 'recived_by']] = df[['send_by', 'recived_by']].apply(
lambda x: x.apply(lambda y: { 'email': y} if '@' in y else {'CellNo':y}))
df2['skillDetails'] = df2.apply(lambda x: {k: x[k]
for k in ('game_name','experience_level')}, axis=1)
df2.drop(columns=['game_name','experience_level'], inplace=True)
# generate the json string
j = pandas.DataFrame(((name[0], name[1],
val.loc(axis=1)['status_id':].to_dict('r'))
for name, val in df2.groupby(['empno', 'work_id'])),
columns = ['empno', 'work_id', 'workPostDetail']).to_json(orient ='records')
这是最终版本-
df2 = df.copy()
# prepare columns
df2[['send_by', 'recived_by']] = df[['send_by', 'recived_by']].apply(
lambda x: x.apply(lambda y: { 'email': y} if '@' in y else {'CellNo':y}))
df2['skillDetails'] = df2.apply(lambda x: {k: x[k]
for k in ('game_name','experience_level')}, axis=1)
df2.drop(columns=['game_name','experience_level'], inplace=True)
df2['workDetails'] = df2.apply(lambda x1: {k1: x1[k1]
for k1 in
('status_id','type','languageId','Language','send_by','recived_by','skillDetails')}, axis=1)
df2.drop(columns=['status_id','type','languageId', 'Language', 'send_by', 'recived_by', 'skillDetails'], inplace=True)
# generate the json string
j = p.DataFrame(((name[0], name[1],
val.loc(axis=1)['workDetails':].to_dict('r'))
for name, val in df2.groupby(['empno', 'work_id'])),
columns = ['empno', 'work_id', 'workPostDetail']).to_json(orient ='records')
谢谢大家 只要一次更正。示例数据中的游戏名称显示为+++和C++。但是,JSON包含实际的游戏名称。您可以选择任何样本并提供方法。提前感谢您的时间。谢谢您的回复。然而,它接近于我正在寻找的解决方案。与我的预期输出相比,唯一缺少的是->“workDetails”: