3 回答
TA贡献2036条经验 获得超8个赞
如果其他方法可以的话,你可以尝试下面的方法,虽然有点脏(你可以尝试优化它)
cols = ['name','color','amount']
u = df[df.columns.difference(cols)].join(df[cols].agg(dict,1).rename('d'))
v = (u.groupby(['cat1','cat2','cat3'])['d'].agg(list).reset_index("cat3"))
v = v.groupby(v.index).apply(lambda x: dict(zip(x['cat3'],x['d'])))
v.index = pd.MultiIndex.from_tuples(v.index,names=['cat1','cat2'])
d = v.unstack(0).to_dict()
print(d)
{'A': {'BB': {'CC': [{'amount': 132, 'color': 'red', 'name': 'P1'},
{'amount': 51, 'color': 'blue', 'name': 'P2'}]},
'BC': {'CD': [{'amount': 12, 'color': 'green', 'name': 'P3'}]}},
'B': {'BB': {'CD': [{'amount': 421, 'color': 'green', 'name': 'P1'},
{'amount': 55, 'color': 'yellow', 'name': 'P4'}]},
'BC': nan},
'C': {'BB': {'CC': [{'amount': 11, 'color': 'red', 'name': 'P1'}]},
'BC': {'CD': [{'amount': 123, 'color': 'blue', 'name': 'P3'}],
'CE': [{'amount': 312, 'color': 'blue', 'name': 'P6'}]}}}
TA贡献1834条经验 获得超8个赞
我们可以groupby基于分组类别cat1递归cat2地cat3构建字典:
def set_val(d, k, v):
if len(k) == 1:
d[k[0]] = v
else:
d[k[0]] = set_val(d.get(k[0], {}), k[1:], v)
return d
dct = {}
for k, g in df.groupby(['cat1', 'cat2', 'cat3']):
set_val(dct, k, {'products': g[['name', 'color', 'amount']].to_dict('r')})
print(dct)
{'A': {'BB': {'CC': {'products': [{'amount': 132, 'color': 'red', 'name': 'P1'},
{'amount': 51, 'color': 'blue', 'name': 'P2'}]}},
'BC': {'CD': {'products': [{'amount': 12, 'color': 'green', 'name': 'P3'}]}}},
'B': {'BB': {'CD': {'products': [{'amount': 421, 'color': 'green', 'name': 'P1'},
{'amount': 55, 'color': 'yellow', 'name': 'P4'}]}}},
'C': {'BB': {'CC': {'products': [{'amount': 11, 'color': 'red', 'name': 'P1'}]}},
'BC': {'CD': {'products': [{'amount': 123, 'color': 'blue', 'name': 'P3'}]},
'CE': {'products': [{'amount': 312, 'color': 'blue', 'name': 'P6'}]}}}}
TA贡献1831条经验 获得超9个赞
def gen_nested_dict(dataframe, group, inner_key, inner_dict):
def set_val(d, k2, v):
if len(k2) == 1:
d[k2[0]] = v
else:
d[k2[0]] = set_val(d.get(k2[0], {}), k2[1:], v)
return d
dct = {}
for k, g in dataframe.groupby(group):
set_val(dct, k, {inner_key: g[inner_dict].to_dict('records')})
return dct
mydct = gen_nested_dict(df, ['cat1', 'cat2', 'cat3'], 'products', ['name', 'color', 'amount'])
添加回答
举报