[英]Convert a three-level hierarchical data into a specific json format
我有一个三级分层数据集,如下所示:
pd.DataFrame({'level1': ['A', 'A', 'A', 'A', 'B'],
'level2': ['A1', 'A1', 'A2', 'A2', 'B1' ],
'level3': ['a', 'b', 'c', 'd', 'e'],
'value': [44, 125, 787, 99, 111],
'pctChg': [0.3, -0.9, -10.0, 12, -0.2]})
level1 level2 level3 value pctChg
0 A A1 a 44 0.3
1 A A1 b 125 -0.9
2 A A2 c 787 -10.0
3 A A2 d 99 12.0
4 B B1 e 111 -0.2
对于像A
这样的特定 level1 类别,有像A1, A2
这样的 level2 类别。 在二级之下,有许多三级类别。 例如,“a”和“b”在“A1”下,“c”和“d”在A2下。 这个数据只是一个例子。 对于每个组合,都有价值和百分比信息(与上个月相比的百分比变化)。
我需要将此数据转换为嵌套的 json 数据。 它需要是如下格式:
{
name: “root”,
value: 1166,
pctChg: xx%,
children: [
{
name: 'A',
value: 956,
pctChg: 'xx%'',
children: [{
name: 'A1',
value: 169,
pctChg: 'xx%'',
children: [{name: 'a', value: 44, pctChg: '30%'},
{name:'b', value:125, pctChg: '-90%'},
{name:'c', value:787, pctChg: '-10%'}
]
}, .....]
},
.....…
]
}
我们还需要汇总一个级别下所有子级的值。 价值可以明显增加。 一个棘手的部分是百分比。 我们可能不想简单地汇总百分比。
这看起来是一项相当艰巨的任务。 不像一些简单的嵌套 json 数据。 我不确定我该如何处理。 感谢有人可以提供帮助。 非常感谢。
第一步是将pctChg列重新格式化为百分比字符串:
df.pctChg = (df.pctChg * 100).astype(int).astype(str) + '%'
(我假设乘以 100公式)。
然后定义 2 个函数来计算第二级和第一级的子级:
def chld2(grp):
return grp.rename(columns={'level3': 'name'}).groupby('level2')\
.apply(lambda grp: pd.Series({'name': grp.iloc[0,1], 'value': grp.value.sum(),
'pctChg': 'xx%', 'children': grp[['name', 'value', 'pctChg']].to_dict('r') }))\
.to_dict('r')
def chld1(df):
return df.groupby('level1').apply(lambda grp: pd.Series({
'name': grp.iloc[0,0], 'value': grp.value.sum(), 'pctChg': 'xx%',
'children': chld2(grp)})).to_dict('r')
要生成结果,请运行:
pd.Series({'name': 'root', 'value': df.value.sum(), 'pctChg': 'xx%',
'children': chld1(df)}).to_json()
结果(手动添加缩进以提高可读性)是:
{ "name":"root", "value":1166, "pctChg":"xx%",
"children":[
{ "name":"A", "value":1055, "pctChg":"xx%",
"children":[
{ "name":"A1", "value":169, "pctChg":"xx%",
"children":[
{"name":"a", "value":44, "pctChg":"30%"},
{"name":"b", "value":125, "pctChg":"-90%"}
]
},
{ "name":"A2", "value":886, "pctChg":"xx%",
"children":[
{"name":"c", "value":787, "pctChg":"-1000%"},
{"name":"d", "value":99, "pctChg":"1200%"}
]
}
]
},
{ "name":"B", "value":111, "pctChg":"xx%",
"children":[
{ "name":"B1", "value":111, "pctChg":"xx%",
"children":[
{"name":"e", "value":111, "pctChg":"-20%"}
]
}
]
}
]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.