我有一个数据框,如下所示:
Lvl1 lvl2 lvl3 lvl4 lvl5
x 1x 3xx 1 "text1"
x 1x 3xx 2 "text2"
x 1x 3xx 3 "text3"
x 1x 4xx 4 "text4"
x 2x 4xx 5 "text5"
x 2x 4xx 6 "text6"
y 2x 5xx 7 "text7"
y 3x 5xx 8 "text8"
y 3x 5xx 9 "text9"
y 3x 6xx 10 "text10"
y 4x 7xx 11 "text11"
y 4x 7xx 62 "text12"
y 4x 8xx 62 "text13"
z
z
z
w
w
w
I would like to convert to nested json so it looks like this:
[{
"x":{
"1x":[{
"3xx": [
{
lvl4: 1
lvl5: "text1"
},
{
lvl4: 2
lvl5: "text2"
},
{
lvl4: 3
lvl5: "text3"
}],
"4xx": [
{
lvl4: 4
lvl5: "text4"
}],
"2x":[{
"4xx": [
{
lvl4: 5
lvl5: "text5"
},
{
lvl4: 6
lvl5: "text6"
}],
"5xx": [
{
lvl4: 7
lvl5: "text7"
}],
}]
。 。
我以示例here作为开始,但是我需要按照所示数据缩进的lvl1,lvl2,lvl3。参考示例以相同级别返回lvl1,lvl2,lvl3。
此外,我需要lvl的密钥作为lvl值。例如“ x”而不是“ lvl1”。
[{
"x":{
谢谢
答案 0 :(得分:2)
根据预期的输出,您可以使用三个嵌套的groupby
和使用to_dict
来实现。可能有更好的方法,但至少是一个开始:
[df.groupby('Lvl1')\
.apply(lambda x: x.groupby('lvl2')\
.apply(lambda x: [x.groupby('lvl3')
.apply(lambda x: x[['lvl4','lvl5']].to_dict('r')
).to_dict()]
).to_dict()
).to_dict()]
[{'x': {'1x': [{'3xx': [{'lvl4': 1, 'lvl5': '"text1"'},
{'lvl4': 2, 'lvl5': '"text2"'},
{'lvl4': 3, 'lvl5': '"text3"'}],
'4xx': [{'lvl4': 4, 'lvl5': '"text4"'}]
}],
'2x': [{'4xx': [{'lvl4': 5, 'lvl5': '"text5"'},
{'lvl4': 6, 'lvl5': '"text6"'}]}]},...
我只是对确切的外部格式有疑问
感谢@Trenton McKinney的编辑,看来如果您这样做:
df['lvl5'] = df['lvl5'].str.strip('"')
test = [df.groupby('Lvl1')\
.apply(lambda x: x.groupby('lvl2')\
.apply(lambda x: [x.groupby('lvl3')
.apply(lambda x: x[['lvl4','lvl5']].to_dict('r')
).to_dict()]
).to_dict()
).to_dict()]
import json
json_res = list(map(json.dumps, test))
然后json_res
可以满足json的需求
test
正确保存为双引号json格式with open('data.json', 'w') as f:
json.dump(test, f)