【发布时间】:2020-09-09 15:41:28
【问题描述】:
我正在寻找一种解决方案来构建具有最后三列 "name"、"color"、"amount" 的嵌套 dict / JSON 作为 “产品” 列表中的属性。 cat1-cat3 列中的值应该是键。
提供的 DataFrame 如下所示:
import pandas as pd
df = pd.DataFrame({
'cat1': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'],
'cat2': ['BB', 'BB', 'BC', 'BB', 'BB', 'BB', 'BC', 'BC'],
'cat3': ['CC', 'CC', 'CD', 'CD', 'CD', 'CC', 'CD', 'CE'],
'name': ['P1', 'P2', 'P3', 'P1', 'P4', 'P1', 'P3','P6'],
'color': ['red', 'blue', 'green', 'green', 'yellow', 'red', 'blue', 'blue']
'amount': [132, 51, 12, 421, 55, 11, 123, 312]
})
这将是所需的输出:
{
"A":{
"BB":{
"CC":{
"products":[
{
"name":"P1",
"color":"red",
"amount":132
},
{
"name":"P2",
"color":"blue",
"amount":51
}
]
}
},
"BC":{
"CD":{
"products":[
{
"name":"P3",
"color":"green",
"amount":12
}
]
}
}
},
"B":{
"BB":{
"CD":{
"products":[
{
"name":"P1",
"color":"green",
"amount":421
},
{
"name":"P4",
"color":"yellow",
"amount":55
}
]
}
}
},
"C":{
"BB":{
"CC":{
"products":[
{
"name":"P1",
"color":"red",
"amount":11
}
]
}
},
"BC":{
"CD":{
"products":[
{
"name":"P3",
"color":"blue",
"amount":123
}
]
},
"CE":{
"products":[
{
"name":"P6",
"color":"blue",
"amount":312
}
]
}
}
}
}
@BEN_YO 为这个问题提供了一个 recursive solution,但没有内部 products 部分。
所以我实际上正在寻找这种方法与内部列表的改编:
def recur_dictify(frame):
if len(frame.columns) == 1:
if frame.values.size == 1: return frame.values[0][0]
return frame.values.squeeze()
grouped = frame.groupby(frame.columns[0])
d = {k: recur_dictify(g.iloc[:,1:]) for k,g in grouped}
return d
recur_dictify(df)
【问题讨论】: