首页 > 解决方案 > 将具有新名称的熊猫数据框的 2 个字段嵌套到 json 中

问题描述

我有这个数据框,我想从中构建一个嵌套了idand字段的 jsonname

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"
}

有人可以给我一个提示吗?谢谢

标签: jsonpandasnested

解决方案


将所有没有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与 lambda 函数一起使用并首先转换为嵌套字典:

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"}]}]

推荐阅读