#json #pandas #nested
#json #pandas #вложенные
Вопрос:
У меня есть этот фрейм данных, из которого я хочу создать json с id
name
вложенными полями и
id name pk model
1 n1 100 mod1
2 n2 101 mod1
3 n3 102 mod1
4 n4 103 mod1
5 n5 104 mod1
6 n6 105 mod1
Чего я хочу:
{
"model":"mod1",
"pk":100,
"fields":{
"id":"1",
"name":"n1"
}
}
Что я делаю:
authordf.groupby(["model", "pk"], as_index=False).to_json(orient="records")
и что у меня есть:
{
"model":"mod1",
"pk":100,
"id":"1",
"name":"n1"
}
Может кто-нибудь дать мне подсказку? Спасибо
Ответ №1:
Преобразуйте все столбцы без model
pk
словаря и в столбец fields
:
authordf['fields'] = authordf.drop(["model", "pk"], 1).apply(lambda x: x.to_dict(), 1)
print (authordf)
id name pk model fields
0 1 n1 100 mod1 {'id': 1, 'name': 'n1'}
1 2 n2 101 mod1 {'id': 2, 'name': 'n2'}
2 3 n3 102 mod1 {'id': 3, 'name': 'n3'}
3 4 n4 103 mod1 {'id': 4, 'name': 'n4'}
4 5 n5 104 mod1 {'id': 5, 'name': 'n5'}
5 6 n6 105 mod1 {'id': 6, 'name': 'n6'}
j = authordf[["model", "pk", 'fields']].to_json(orient="records")
print (j)
[{"model":"mod1","pk":100,"fields":{"id":1,"name":"n1"}},
{"model":"mod1","pk":101,"fields":{"id":2,"name":"n2"}},
{"model":"mod1","pk":102,"fields":{"id":3,"name":"n3"}},
{"model":"mod1","pk":103,"fields":{"id":4,"name":"n4"}},
{"model":"mod1","pk":104,"fields":{"id":5,"name":"n5"}},
{"model":"mod1","pk":105,"fields":{"id":6,"name":"n6"}}]
Если имеется несколько значений, используйте DataFrame.groupby
лямбда-функцию и сначала преобразуйте во вложенные словари:
print (authordf)
id name pk model
0 1 n1 100 mod1
1 2 n2 100 mod1
2 3 n3 102 mod1
3 4 n4 102 mod1
4 5 n5 104 mod1
5 6 n6 105 mod1
c = authordf.columns.difference(["model", "pk"])
j = (authordf.groupby(["model", "pk"])[c].apply(lambda x: x.to_dict('records'))
.reset_index(name='fields')
.to_json(orient="records"))
print (j)
[{"model":"mod1","pk":100,"fields":[{"id":1,"name":"n1"},{"id":2,"name":"n2"}]},
{"model":"mod1","pk":102,"fields":[{"id":3,"name":"n3"},{"id":4,"name":"n4"}]}
,{"model":"mod1","pk":104,"fields":[{"id":5,"name":"n5"}]},
{"model":"mod1","pk":105,"fields":[{"id":6,"name":"n6"}]}]