首页 > 解决方案 > 将熊猫数据框放入嵌套子字典

问题描述

我有一个如下所示的数据框,其中每个“级别”都深入到更多细节,最后一个级别有一个 id 值。

data = [
    {'id': 1, 'level_1': 'Animals', 'level_2': 'Carnivores', 'level_3': 'Felidae', 'level_4', 'Siamese Cat'},
    {'id': 2, 'level_1': 'Animals', 'level_2': 'Carnivores', 'level_3': 'Felidae', 'level_4', 'Javanese Cat'},
    {'id': 3, 'level_1': 'Animals', 'level_2': 'Carnivores', 'level_3': 'Ursidae', 'level_4', 'Polar Bear'},
    {'id': 4, 'level_1': 'Animals', 'level_2': 'Carnivores', 'level_3': 'Canidae', 'level_4', 'Labradore Retriever'},
    {'id': 5, 'level_1': 'Animals', 'level_2': 'Carnivores', 'level_3': 'Canidae', 'level_4', 'Golden Retriever'}
]

我想把它变成一个嵌套的父/子关系字典,如下所示。

var data = {
  "name": "Animals",
  "children": [
    {
      "name": "Carnivores",
      "children": [
        {
          "name": "Felidae",
          "children": [
            {
              "id": 1,
              "name": "Siamese Cat",
              "children": []
            },
            {
              "id": 2,
              "name": "Javanese Cat",
              "children": []
            }
          ]
        },
        {
          "name": "Ursidae",
          "children": [
            {
              "id": 3,
              "name": "Polar Bear",
              "children": []
            }
          ]
        },
        {
          "name": "Canidae",
          "children": [
            {
              "id": 4,
              "name": "Labradore Retriever",
              "children": []
            },
            {
              "id": 5,
              "name": "Golden Retriever",
              "children": []
            }
          ]
        }
      ]
    }
  ]
}

我尝试了几种对数据框进行分组并循环遍历各个行的方法,但还没有找到可行的解决方案。任何帮助将不胜感激!

标签: pythonpandas

解决方案


@Timus 的答案模仿了您的意图,但是您在搜索此词典时可能会遇到一些困难,因为每个级别都有一个 keyname和一个 key children。如果这是您的意图,请忽略我的回答。但是,如果您想创建一个可以更轻松地通过唯一键搜索的字典,您可以尝试:

df = df.set_index(['level_1', 'level_2', 'level_3', 'level_4'])

def make_dictionary(df):
    if df.index.nlevels == 1:
        return df.to_dict()

    dictionary = {}
    for key in df.index.get_level_values(0).unique():
        sub_df = df.xs(key)
        dictionary[key] = df_to_dict(sub_df)
    return dictionary

make_dictionary(df)

它需要将不同的级别设置为索引,您最终会得到一个稍微不同的字典:

{'Animals': 
    {'Carnivores': 
        {'Felidae': 
          {'id': {'Siamese Cat': 1,
                  'Javanese Cat': 2}},
         'Ursidae': 
          {'id': {'Polar Bear': 3}},
         'Canidae': 
          {'id': {'Labradore Retriever': 4, 
                  'Golden Retriever': 5}}}
    }
}

推荐阅读