gpt4 book ai didi

python - 一对多加入 pandas 数据帧作为 JSON 而不是 pandas 数据帧

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:22 24 4
gpt4 key购买 nike

我有 2 个 Pandas 数据框:

dept = pd.DataFrame({'dep_id': [1,2], 'dep_name':['shoes', 'giraffes']})
emp = pd.DataFrame({'dep_id': [1,1,2], 'emp_name': ['joe', 'bo', 'gigi']})

加入它们会为 emp 中的每一行复制 dept 行,这是关系连接中的惯例:

pd.merge(dept, emp, on = 'dep_id')

dep_id dep_name emp_name
0 1 shoes joe
1 1 shoes bo
2 2 giraffes gigi

相反,我想创建一个分层的 JSON:例如

[ 
{ dep_name: 'shoes', emps: [{emp_name: 'joe'}, {emp_name: 'bo'}]},
{ dep_name: 'giraffes', emps: [{emp_name: 'gigi'}]}
]

什么是优雅的方式来做到这一点?我可以加入,然后进行分组,但无法判断哪些列进入外部部门,哪些进入 emps...

最佳答案

一种可能的解决方案是在 apply 中定义列到 emps DataFrames 列表:

d = (pd.merge(dept, emp, on = 'dep_id')
.groupby('dep_name').apply(lambda x: x[['emp_name']]
.to_dict('r'))
.reset_index(name='emps'))

print (d)
dep_name emps
0 giraffes [{'emp_name': 'gigi'}]
1 shoes [{'emp_name': 'joe'}, {'emp_name': 'bo'}]


j = d.to_json(orient='records')
print (j)
[{"dep_name":"giraffes","emps":[{"emp_name":"gigi"}]},
{"dep_name":"shoes","emps":[{"emp_name":"joe"},{"emp_name":"bo"}]}]
d = (pd.merge(dept, emp, on = 'dep_id')
.groupby('dep_name').apply(lambda x: x[['emp_name', 'dep_id']]
.to_dict('r'))
.reset_index(name='emps'))

print (d)
dep_name emps
0 giraffes [{'dep_id': 2, 'emp_name': 'gigi'}]
1 shoes [{'dep_id': 1, 'emp_name': 'joe'}, {'dep_id': ...

j = d.to_json(orient='records')
print (j)
[{"dep_name":"giraffes","emps":[{"dep_id":2,"emp_name":"gigi"}]},
{"dep_name":"shoes","emps":[{"dep_id":1,"emp_name":"joe"},{"dep_id":1,"emp_name":"bo"}]}]

编辑1:

我认为对于所有从嵌套 json 转换出来的列需要:

dept = pd.DataFrame({'dep_id': [1,2], 'dep_name':['shoes', 'giraffes'], 'def_size':[4,5]})
emp = pd.DataFrame({'dep_id': [1,1,2], 'emp_name': ['joe', 'bo', 'gigi']})

df = pd.merge(dept, emp, on = 'dep_id')
#single columns def_size and dep_name
d = (df.groupby(['def_size','dep_name']).apply(lambda x: x[['emp_name']]
.to_dict('r'))
.reset_index(name='emps'))
print (d)
def_size dep_name emps
0 4 shoes [{'emp_name': 'joe'}, {'emp_name': 'bo'}]
1 5 giraffes [{'emp_name': 'gigi'}]

j = d.to_json(orient='records')
print (j)
[{"def_size":4,"dep_name":"shoes","emps":[{"emp_name":"joe"},{"emp_name":"bo"}]},
{"def_size":5,"dep_name":"giraffes","emps":[{"emp_name":"gigi"}]}]

关于python - 一对多加入 pandas 数据帧作为 JSON 而不是 pandas 数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50366424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com