pandas 合并具有数组的 Dataframe

aor9mmx1  于 2023-04-19  发布在  其他
关注(0)|答案(2)|浏览(98)

我有两个 Dataframe 。

DF1

isActive,trackedSearchId
True,53436615
True,53434228
True,53434229

DF2

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
lzfw57am

lzfw57am1#

假设列表的字符串表示为df2,使用ast.literal_eval,然后使用groupby.aggexplodemerge

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
hwamh0ep

hwamh0ep2#

如果需要,可以使用转换值的DataFrame.explodeast.literal_eval列出,在GroupBy.agg中聚合join并在DataFrame.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'))

相关问题