首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫:如何在JSONresponse中平展/拆分多个嵌套字典

熊猫:如何在JSONresponse中平展/拆分多个嵌套字典
EN

Stack Overflow用户
提问于 2022-11-09 23:00:37
回答 1查看 33关注 0票数 -1

我收到了这样的json回复:

代码语言:javascript
复制
{
            "id": 7,
            "status": "Public",
            "Options": [
                  {
                        "id": 8,
                        "pId": 7
                  },
                  {
                      "id": 9,
                        "pId": 10
                  }
               ]
}

我正试着用pandas dataframe把它压平

代码语言:javascript
复制
df = pd.DataFrame.from_dict(response_data)

#spliting production options
df=df.join(pd.DataFrame(df["Options"].values.tolist()).add_prefix('Options_'))
df = df.drop(columns=["Options"])

#spliting nested product options
df=df.join(pd.DataFrame(df["Options_0"].values.tolist()).add_prefix('Options0_'))
df = df.drop(columns=["Options_0"])

此代码用于在响应只有一个Options时工作。

代码语言:javascript
复制
{
            "id": 7,
            "status": "Public",
            "Options": [
                  {
                        "id": 8,
                        "pId": 7
                  }
              ]
}

现在在json响应中有多个Options,如何迭代它并得到类似于

代码语言:javascript
复制
id   status   Options_0_id  Options_0_pId    Options_1_id  Options_2_pId
7     Public     8                  7           9            10    
EN

回答 1

Stack Overflow用户

发布于 2022-11-11 21:21:45

让我们使用group函数将id、pId值​​输入到列表中。

代码语言:javascript
复制
df = pd.DataFrame(response_data)
df=df.rename(columns={'id':'id_main'})
df=df.join(pd.json_normalize(df.pop('Options')))
df=df.groupby('id_main').agg({'status':'first','id':list,'pId':list})
print(df)
'''
         status      id      pId
id_main                         
7        Public      [8, 9]  [7, 10]
'''

现在,我们将将id和pId列转换为单独的数据格式,并在最后将它们与df合并。

代码语言:javascript
复制
a = pd.DataFrame(df.id.tolist(), index= df.index).rename('Options_{}_id'.format, axis=1)
print(a)
'''
         Options_0_id  Options_1_id
id_main                            
7                   8             9
'''

#Let's do the same for the pId column.
b=  pd.DataFrame(df.pId.tolist(), index= df.index).rename('Options_{}_pId'.format, axis=1)
print(b)
'''
         Options_0_pId  Options_1_pId
id_main                              
7                    7             10
'''

最后,让我们把这一切放在一起

代码语言:javascript
复制
df=df.join([a,b]).drop(['id','pId'],axis=1).reset_index()
print(df)
'''
id_main status  Options_0_id    Options_1_id    Options_0_pId   Options_1_pId
7       Public  8               9               7               10

'''

如果您想按问题对列进行排序:

代码语言:javascript
复制
df=df.set_index(['id_main','status'])
df = df.sort_index(axis=1).reset_index()
print(df)
'''
   id_main  status  Options_0_id  Options_0_pId  Options_1_id  Options_1_pId
0        7  Public             8              7             9             10
'''

还可以重命名id_main:

代码语言:javascript
复制
df=df.rename(columns={'id_main':'id'})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74382327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档