合并具有数组的数据帧

Merge dataframes having array

提问人:Avenger 提问时间:4/13/2023 最后编辑:Avenger 更新时间:4/13/2023 访问量:35

问:

我有两个数据框。

东风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
python-3.x pandas 数据帧 python-2.7

评论


答:

1赞 mozway 4/13/2023 #1

假设 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
1赞 jezrael 4/13/2023 #2

如有必要,可以使用转换值的 DataFrame.explode 列出,在 GroupBy.agg 中聚合并在 DataFrame.join 中附加新列:ast.literal_evaljoin

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'))