gpt4 book ai didi

python - 将两个关系型 pandas 数据帧合并为单个嵌套 json 输出

转载 作者:行者123 更新时间:2023-12-01 09:31:17 26 4
gpt4 key购买 nike

我有两个关系数据框,如下所示。

df_doc:

|document_id| name|
+-----------+-----+
| 1| aaa|
| 2| bbb|

df_topic:

|   topic_id| name|document_id|
+-----------+-----+-----------+
| 1| xxx| 1|
| 2| yyy| 2|
| 3| zzz| 2|

我想将它们合并到一个嵌套的 json 文件中,如下所示。

[
{
"document_id": 1,
"name": "aaa",
"topics": [
{
"topic_id": 1,
"name": "xxx"
}
]
},
{
"document_id": 2,
"name": "bbb",
"topics": [
{
"topic_id": 2,
"name": "yyy"
},
{
"topic_id": 3,
"name": "zzz"
}
]
}
]

也就是说,我想做 pandas.io.json.json_normalize 所做的相反操作。

使用 sqlite 的答案也可以。

注意:df_doc 和 df_topic 都有“name”列,它们具有相同的名称但不同的值

谢谢。

最佳答案

如果只有 2 列 df_doc 使用 map首先加入新列 title 然后 groupby转换为to_dict然后to_json :

s = df_doc.set_index('document_id')['title']
df_topic['title'] = df_topic['document_id'].map(s)

#filter all columns without values in list
cols = df_topic.columns.difference(['document_id','title'])
j = (df_topic.groupby(['document_id','title'])[cols]
.apply(lambda x: x.to_dict('r'))
.reset_index(name='topics')
.to_json(orient='records'))
print (j)

[{"document_id":1,"title":"aaa","topics":[{"name":"xxx","topic_id":1}]},
{"document_id":2,"title":"bbb","topics":[{"name":"yyy","topic_id":2},
{"name":"zzz","topic_id":3}]}]

如果 df_doc 中有多个列,请使用 join相反 map :

df = df_topic.merge(df_doc, on='document_id')
print (df)
topic_id name document_id title
0 1 xxx 1 aaa
1 2 yyy 2 bbb
2 3 zzz 2 bbb

cols = df.columns.difference(['document_id','title'])
j = (df.groupby(['document_id','title'])[cols]
.apply(lambda x: x.to_dict('r'))
.reset_index(name='topics')
.to_json(orient='records'))

编辑:如果可以使用相同的列名,请添加参数后缀,以便将_添加到列名中,以实现唯一和最后strip:

df = df_topic.merge(df_doc, on='document_id', suffixes=('','_'))
print (df)
topic_id name document_id name_
0 1 xxx 1 aaa
1 2 yyy 2 bbb
2 3 zzz 2 bbb

cols = df.columns.difference(['document_id','title'])
j = (df.groupby(['document_id','name_'])[cols]
.apply(lambda x: x.to_dict('r'))
.reset_index(name='topics')
.rename(columns=lambda x: x.rstrip('_'))
.to_json(orient='records'))
print (j)
[{"document_id":1,"name":"aaa","topics":[{"name":"xxx","name_":"aaa","topic_id":1}]},
{"document_id":2,"name":"bbb","topics":[{"name":"yyy","name_":"bbb","topic_id":2},
{"name":"zzz","name_":"bbb","topic_id":3}]}]

关于python - 将两个关系型 pandas 数据帧合并为单个嵌套 json 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49953820/

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