簡體   English   中英

基於str.contains的pandas數據框合並

[英]pandas dataframe merge based on str.contains

我有兩個要基於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

提前謝謝。

設定

我們可以通過創建一個新的系列,其在各個領域的行開始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。

嘗試對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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM