基于str.contains的pandas数据帧合并

4

我有两个数据框,希望能根据 df2 的列值是否包含 df1 的列值进行合并。我一直在尝试使用 str.contains 和 series.isin 方法进行操作,但迄今为止都没有成功。下面是一个示例。

df1

       Domain              Visits
         aaa                  1 
         bbb                  3
         ddd                  5

df2

       Domain                Ads
         aaa.com              2 
         bbb                  4
         c.com                3
         e.net                6

合并后的数据框应该是这样的:

mergeDF

       Domain              Visits       Ads
         aaa.com              1          2
         bbb                  3          4
         c.com                           3
         ddd                  5          
         e.net                           6

提前感谢。


你能再检查一下输出吗?dd 列应该是访问次数为 5,而不是广告次数。同样地,c.com 的广告次数应该是 3,而不是访问次数。 - user3483203
1
你说得对,我会修复它。谢谢你发现了这个问题。 - SwagZ
df2中的一个元素如果不包含df1中的任何内容,应该怎么处理?如果df2中的多个元素与df1中的某个元素匹配,应该怎么处理? - fuglede
  1. 该元素仍将存在于mergeDF中。
  2. 很好的发现,我还没有真正考虑过这个问题。但是我认为如果多个元素匹配,应该将Visits和Ads的值相加。@fuglede
- SwagZ
2个回答

4

设置

我们可以通过创建一个新系列来开始,该系列是df2中每个域名对应于df1中的行,如果存在这样的行:

r = '({})'.format('|'.join(df1.Domain))
merge_df = df2.Domain.str.extract(r, expand=False).fillna(df2.Domain)

我们的merge_df现在看起来是这样的:
0      aaa
1      bbb
2    c.com
3    e.net
Name: Domain, dtype: object

现在我们要合并两个数据框。我们需要进行外连接,将第一个数据框按照“Domain”列与第二个数据框按照“merge_df”序列合并:
df1.merge(df2.drop('Domain', 1), left_on='Domain', right_on=merge_df, how='outer')

 Domain  Visits  Ads
0    aaa     1.0  2.0
1    bbb     3.0  4.0
2    ddd     5.0  NaN
3  c.com     NaN  3.0
4  e.net     NaN  6.0

由于我们存储了一个单独的系列以进行合并,并且没有修改df2,因此在此步骤之后完成,您将拥有合并后的数据框。


1

请尝试预处理df2,使其域名格式与df1相同:

df2['key'] = df2['Domain'].str.extract('(\w+)\.?')

df_out = df1.merge(df2, left_on='Domain', right_on='key', suffixes=('_x',''), how='outer')

df_out['Domain'] = df_out['Domain'].combine_first(df_out['Domain_x'])

df_out = df_out.drop(['Domain_x','key'], axis=1)

print(df_out)

输出:

   Visits   Domain  Ads
0     1.0  aaa.com  2.0
1     3.0      bbb  4.0
2     5.0      ddd  NaN
3     NaN    c.com  3.0
4     NaN    e.net  6.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接