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

时间:2018-08-21 19:22:37

标签: python pandas dataframe

我想基于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

提前谢谢。

2 个答案:

答案 0 :(得分:3)

设置

我们可以从创建一个新系列开始,如果存在这样的行,则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列上的第一个DataFrame和merge_df系列中的第二个DataFrame合并:

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,因此在完成此步骤之后,您已经合并了DataFrame。

答案 1 :(得分: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