【问题标题】:pandas dataframe merge based on str.contains基于 str.contains 的 pandas 数据框合并
【发布时间】:2018-08-21 19:22:36
【问题描述】:

我有两个数据框,我想根据 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

合并后的Dataframe应该是这样的

合并 DF

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

提前致谢。

【问题讨论】:

  • 你能仔细检查你的输出吗? dd 不应该在访问列中有 5,而不是广告吗?另外,c.com 不应该在广告中使用 3,而不是访问?
  • 你是对的,我会修复它。谢谢你抓住它。
  • df2 中不包含来自df1 的任何元素会发生什么?如果df2 中的多个元素与df1 中的给定元素匹配怎么办?
  • 1.该元素仍将存在于 mergeDF 中。 2. 很棒的收获,我还没有真正考虑过。但我认为如果多个元素匹配,它应该总结访问和广告的价值。 @fuglede

标签: python pandas dataframe


【解决方案1】:

设置

我们可以从创建一个新系列开始,这是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。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-02-17
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      相关资源
      最近更新 更多