首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将嵌套的dict转换为数据

如何将嵌套的dict转换为数据
EN

Stack Overflow用户
提问于 2021-06-15 01:29:36
回答 3查看 105关注 0票数 1

假设我有一个API响应,如:

代码语言:javascript
复制
{
    "fact": {
        "UP": [{
            "SCODE": "CNB",
            "SNAME": "Kanpur Central"
        }, {
            "SCODE": "JHS",
            "SNAME": "Jhansi Junction"
        }],
        "MP": [{
            "SCODE": "BPL",
            "SNAME": "Bhopal Junction"
        }, {
            "SCODE": "JBP",
            "SNAME": "Jabalpur Junction"
        }]
    }
}

我必须将其转换为如下所示的数据格式(预期输出):

代码语言:javascript
复制
fact    SCODE   SNAME
UP      CNB     Kanpur Central
UP      JHS     Jhansi Junction
MP      BPL     Bhopal Junction
MP      JBP     Jabalpur Junction

我的努力:我尝试使用json_normalize(),但没有达到预期的输出:

代码语言:javascript
复制
pd.json_normalize(response).apply(pd.Series.explode)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-06-15 01:51:25

一种选择是使用python重新构建:

代码语言:javascript
复制
df = pd.DataFrame([{'fact': k, **item}
                   for k, lst in response['fact'].items()
                   for item in lst])
代码语言:javascript
复制
  fact SCODE              SNAME
0   UP   CNB     Kanpur Central
1   UP   JHS    Jhansi Junction
2   MP   BPL    Bhopal Junction
3   MP   JBP  Jabalpur Junction

pandas通过explode + apply pd.Series的选项

代码语言:javascript
复制
df = (
    pd.DataFrame(response)['fact']
        .explode()
        .apply(pd.Series)
        .rename_axis('fact')
        .reset_index()
)
代码语言:javascript
复制
  fact SCODE              SNAME
0   MP   BPL    Bhopal Junction
1   MP   JBP  Jabalpur Junction
2   UP   CNB     Kanpur Central
3   UP   JHS    Jhansi Junction
票数 5
EN

Stack Overflow用户

发布于 2021-06-15 01:57:45

  • 使用OP.
  • 中的response,您必须创建另一个结构,因为json_normalize使用字典列表,而fact必须包含在那里:

代码语言:javascript
复制
new_response = [{"fact": rfact, **r} for rfact in response["fact"] for r in response["fact"][rfact]]

最后,只需应用该函数:

代码语言:javascript
复制
final_result = pd.json_normalize(new_response)

  fact SCODE              SNAME
0   UP   CNB     Kanpur Central
1   UP   JHS    Jhansi Junction
2   MP   BPL    Bhopal Junction
3   MP   JBP  Jabalpur Junction
票数 1
EN

Stack Overflow用户

发布于 2021-06-15 09:10:22

不像直接在字典中工作那样有效(所选的答案做得很好):

代码语言:javascript
复制
    data = {
    "fact": {
        "UP": [{
            "SCODE": "CNB",
            "SNAME": "Kanpur Central"
        }, {
            "SCODE": "JHS",
            "SNAME": "Jhansi Junction"
        }],
        "MP": [{
            "SCODE": "BPL",
            "SNAME": "Bhopal Junction"
        }, {
            "SCODE": "JBP",
            "SNAME": "Jabalpur Junction"
        }]
    }
}

keys = data['fact']

   (pd.concat([jn(data['fact'][key]) for key in keys], 
              keys = keys)
      .droplevel(-1)
      .rename_axis(index='fact')
      .reset_index()
     )



fact SCODE              SNAME
0   UP   CNB     Kanpur Central
1   UP   JHS    Jhansi Junction
2   MP   BPL    Bhopal Junction
3   MP   JBP  Jabalpur Junction
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67978892

复制
相关文章

相似问题

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