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

标签 python json nested

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

我正在尝试使用 Python Pandas 生成嵌套的 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')

关于python - 如何使用 python 生成特定的嵌套 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54321717/

相关文章:

python - 字符/数字的边界框检测

python - 警告 : `pyenv init -` no longer sets PATH. MacOS

python - Numpy 转置将条目转换为字符串?

python - Pandas dataframe group by 不会删除分组键

php - 将 php 数组转换为单个 JSON 对象

json - Azure 流分析查询 JSON

regex - 可以使用正则表达式来匹配嵌套模式吗?

java - 我的应用程序给出 "Register Error 1"- 为什么会这样?

jquery - 如何在 jQuery 中处理嵌套事件

sql-server - SQL Server 选择随机和非随机