Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python生成特定的嵌套JSON_Python_Json_Nested - Fatal编程技术网

如何使用python生成特定的嵌套JSON

如何使用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[

无法使用Python在JSON中生成特定的组和子组

我正在尝试使用Python生成嵌套JSON。但是,不知何故,我无法理解子分组是如何工作的,或者更确切地说,我可以生成它。不知道如何先打包子组,然后再打包

python或pandas或任何相关的python包中是否有任何内置函数可以在不编写大量代码的情况下执行相同的操作

我写的如下:

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”: