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

Python 基于str.contains的数据帧合并,python,pandas,dataframe,Python,Pandas,Dataframe,如果来自df2的列值包含来自df1的列值,我将基于这两个数据帧进行合并。我一直在尝试使用str.contains和series.isin。但到目前为止运气不好。下面的例子 df1 df2 合并的数据帧应该是这样的 合并 Domain Visits Ads aaa.com 1 2 bbb 3 4 c

如果来自df2的列值包含来自df1的列值,我将基于这两个数据帧进行合并。我一直在尝试使用str.contains和series.isin。但到目前为止运气不好。下面的例子

df1

df2

合并的数据帧应该是这样的

合并

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

Thx提前。

尝试并预处理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

尝试并预处理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
设置

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

r = '({})'.format('|'.join(df1.Domain))
merge_df = df2.Domain.str.extract(r, expand=False).fillna(df2.Domain)
我们的合并df现在如下所示:

0      aaa
1      bbb
2    c.com
3    e.net
Name: Domain, dtype: object
现在我们合并。我们需要一个外部合并,合并域列上的第一个数据帧,合并merge_df系列上的第二个数据帧:

因为我们存储了一个单独的系列以进行合并,并且没有修改df2,所以我们在这一步之后就完成了,您有了合并的数据帧。

设置

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

r = '({})'.format('|'.join(df1.Domain))
merge_df = df2.Domain.str.extract(r, expand=False).fillna(df2.Domain)
我们的合并df现在如下所示:

0      aaa
1      bbb
2    c.com
3    e.net
Name: Domain, dtype: object
现在我们合并。我们需要一个外部合并,合并域列上的第一个数据帧,合并merge_df系列上的第二个数据帧:


因为我们存储了一个单独的系列以进行合并,并且没有修改df2,所以我们在这一步之后就完成了,您有了合并后的数据帧。

您能再次检查您的输出吗?dd不应该在访问栏中有5个,而不是广告吗?另外,c.com的广告中不应该有一个3,而不是访问量吗?你是对的,我会修正它。感谢您捕捉到它。如果df2中的元素不包含任何来自df1的内容,该怎么办?如果df2中的多个元素与df1中的给定元素匹配,该怎么办。该元素仍将存在于mergeDF中。2.太棒了,我还没想过呢。但我认为,如果多个元素匹配,那么访问量和广告的价值应该加起来。@fugledeCan你能仔细检查一下你的输出吗?dd不应该在访问栏中有5个,而不是广告吗?另外,c.com的广告中不应该有一个3,而不是访问量吗?你是对的,我会修正它。感谢您捕捉到它。如果df2中的元素不包含任何来自df1的内容,该怎么办?如果df2中的多个元素与df1中的给定元素匹配,该怎么办。该元素仍将存在于mergeDF中。2.太棒了,我还没想过呢。但我认为,如果多个元素匹配,那么访问量和广告的价值就应该综合起来。@fuglede