将所有没有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"}}]
如果有多个值,请使用带有 lambda 函数的 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"}]}]