基于2个键列和1个值列的带有嵌套词典的pandas数据帧转换为词典

时间:2018-08-07 08:12:16

标签: python pandas dictionary dataframe

我在熊猫中有一个数据框,如下所示:

{ path: 'contact', loadChildren: 'contact.module#ContactModule' }
{ path: 'contact', loadChildren: '/contact.module#ContactModule' }
{ path: 'contact', loadChildren: './contact.module#ContactModule' }

{ path: 'contact', loadChildren: 'contact/contact.module#ContactModule' }
{ path: 'contact', loadChildren: '/contact/contact.module#ContactModule' }
{ path: 'contact', loadChildren: './contact/contact.module#ContactModule' }

{ path: 'contact', loadChildren: 'lib/contact/contact.module#ContactModule' }    
{ path: 'contact', loadChildren: '/lib/contact/contact.module#ContactModule' }
{ path: 'contact', loadChildren: './lib/contact/contact.module#ContactModule' }

我正在尝试创建一个包含key1的键和一个key2和value的嵌套词典的字典。我尝试了以下方法:

df = pd.DataFrame({'key1': ['abcd', 'defg', 'hijk', 'abcd'],
                   'key2': ['zxy', 'uvq', 'pqr', 'lkj'],
                   'value': [1, 2, 4, 5]})

所需的输出:

dct = df.groupby('key1')[['key2', 'value']].apply(lambda x: x.set_index('key2').to_dict(orient='index')).to_dict()

dct

{'abcd': {'zxy': {'value': 1}, 'lkj': {'value': 5}},
 'defg': {'uvq': {'value': 2}},
 'hijk': {'pqr': {'value': 4}}}

1 个答案:

答案 0 :(得分:2)

使用collections.defaultdict,您可以构造defaultdict个对象的dict,并在迭代数据帧时添加元素:

from collections import defaultdict

d = defaultdict(dict)

for row in df.itertuples(index=False):
    d[row.key1][row.key2] = row.value

print(d)

defaultdict(dict,
            {'abcd': {'lkj': 5, 'zxy': 1},
             'defg': {'uvq': 2},
             'hijk': {'pqr': 4}})

由于defaultdictdict的子类,因此不需要进一步的工作。