提问人:Avenger 提问时间:4/13/2023 最后编辑:Avenger 更新时间:4/13/2023 访问量:35
合并具有数组的数据帧
Merge dataframes having array
问:
我有两个数据框。
东风1
isActive,trackedSearchId
True,53436615
True,53434228
True,53434229
EFS的
trackedSearchIds,Primary Keyword Group(s)
"[53436613, 53436615, 53437436, 53436506]",SEO - Directory-Deployment
"[53435887, 53437509, 53437441, 53436615, 53438685, 53437636]",SEO - Other-Glossary
"[53437504, 53435090, 53435887, 53434228]",SEO - Other
"[53437504, 53435090, 53434229]",SEO - Glossary
我想检查 DF1 的每一行的列 trackedSearchId,并检查 DF2 中的每一行,以及 trackedSearchIds 数组的每个值,如果 DF1 列的值存在于 DF2 中,请将其附加到 DF1。
输出应如下所示:
isActive,trackedSearchId,Primary Keyword Group(s)
True,53436615,SEO - Directory-Deployment&SEO - Other-Glossary
True,53434228,SEO - Other
True,53434229,SEO - Glossary
答:
1赞
mozway
4/13/2023
#1
假设 df2 中列表的字符串表示形式,请使用 ast.literal_eval
,然后使用 groupby.agg
、explode
和 merge
:
import ast
df1['trackedSearchId'] = df1['trackedSearchId'].astype(str)
out = df1.merge((df2.assign(trackedSearchIds=df2['trackedSearchIds'].str.findall(r'(\d+)')).explode('trackedSearchIds')
.groupby('trackedSearchIds').agg('&'.join)
),
left_on='trackedSearchId', right_on='trackedSearchIds')
输出:
isActive trackedSearchId Primary Keyword Group(s)
0 True 53436615 SEO - Directory-Deployment&SEO - Other-Glossary
1 True 53434228 SEO - Other
2 True 53434229 SEO - Glossary
1赞
jezrael
4/13/2023
#2
如有必要,可以使用转换值的 DataFrame.explode
列出,在 GroupBy.agg
中聚合并在 DataFrame.join
中附加新列:ast.literal_eval
join
import ast
df = (df1.join(df2.assign(trackedSearchIds=df2['trackedSearchIds'].apply(ast.literal_eval))
.explode('trackedSearchIds')
.groupby('trackedSearchIds')['Primary Keyword Group(s)']
.agg('&'.join), on='trackedSearchId'))
print (df)
isActive trackedSearchId Primary Keyword Group(s)
0 True 53436615 SEO - Directory-Deployment&SEO - Other-Glossary
1 True 53434228 SEO - Other
2 True 53434229 SEO - Glossary
如果值是列表:
df = (df1.join(df2
.explode('trackedSearchIds')
.groupby('trackedSearchIds')['Primary Keyword Group(s)']
.agg('&'.join), on='trackedSearchId'))
评论