3 回答

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果其他方法可以的話,你可以嘗試下面的方法,雖然有點(diǎn)臟(你可以嘗試優(yōu)化它)
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貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
我們可以groupby基于分組類別cat1遞歸cat2地cat3構(gòu)建字典:
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貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊
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'])
添加回答
舉報(bào)