2016-10-11 51 views
2

我想連接兩個dataframes:重複IFERROR和VLOOKUP在大熊貓加入

df1 = pd.DataFrame({'Banner': {0: 'banner1', 1: 'banner2', 2: 'banner3'}, 
        'Campaign': {0: 'campaign1', 1: 'campaign2', 2: '12345'}, 
        'Country ': {0: 'de', 1: 'it', 2: 'de'}, 
        'Date': {0: '1/1/2016', 1: '2/1/2016', 2: '1/1/2016'}, 
        'Value_1': {0: 10, 1: 5, 2: 20}}) 

df2 = pd.DataFrame({'Banner': {0: 'banner1', 1: 'banner2', 2: 'banner3', 3: 'banner4', 4: 'banner5'}, 
        'Campaign': {0: 'campaign1',1: 'campaign2', 2: 'none',3: 'campaign4',4: 'campaign5'}, 
        'Country ': {0: 'de', 1: 'it', 2: 'de', 3: 'en', 4: 'en'}, 
        'Date': {0: '1/1/2016', 1: '2/1/2016', 2: '1/1/2016', 3: '3/1/2016', 4: '4/1/2016'}, 
        'Value_2': {0: 5, 1: 10, 2: 15, 3: 20, 4: 25},    
        'id_campaign': {0: 'none', 1: 'none', 2: '12345', 3: 'none', 4: 'none'}}) 

編輯: 讓我們想象的選項:

df1 = pd.DataFrame({'Banner': {0: 'banner1', 1: 'banner2', 2: 'banner3'}, 
       'Campaign': {0: 'campaign1', 1: 'campaign2', 2: '12345'}, 
       'Date': {0: '1/1/2016', 1: '2/1/2016', 2: '1/1/2016'}, 
       'Value_1': {0: 10, 1: 5, 2: 20}}) 

我不得不加入DF2與DF1在鍵上:

  • 日期
  • 運動
  • 橫幅

這裏的問題是,當在關鍵「戰役」中沒有找到匹配的,關鍵應該切換到字段「id_campaign」。

我想獲得該數據幀:

df_joined = pd.DataFrame({'Banner': {0: 'banner1', 1: 'banner2', 2: 'banner3', 3: 'banner4', 4: 'banner5'}, 
         'Campaign': {0: 'campaign1', 1: 'campaign2', 2: 'none', 3: 'campaign4', 4: 'campaign5'}, 
         'Country ': {0: 'de', 1: 'it', 2: 'de', 3: 'en', 4: 'en'}, 
         'Date': {0: '1/1/2016', 1: '2/1/2016', 2: '1/1/2016', 3: '3/1/2016', 4: '4/1/2016'}, 
         'Value_1': {0: 10, 1: 5, 2: 20, 3: 0, 4: 0}, 
         'Value_2': {0: 5, 1: 10, 2: 15, 3: 20, 4: 25}, 
         'id_campaign': {0: 'none', 1: 'none', 2: '12345', 3: 'none', 4: 'none'}}) 

任何幫助非常感謝。

回答

0

您可以使用雙merge 3和2鍵,然後通過combine_firstdf4Value_1欄填不匹配值:

df3 = pd.merge(df2, df1.drop('Country', axis=1), on=['Date','Campaign','Banner'], how='left') 
df4 = pd.merge(df2, df1, on=['Date','Banner'], how='left') 

print (df3) 
    Banner Campaign Country  Date Value_2 id_campaign Value_1 
0 banner1 campaign1  de 1/1/2016  5  none  10.0 
1 banner2 campaign2  it 2/1/2016  10  none  5.0 
2 banner3  none  de 1/1/2016  15  12345  NaN 
3 banner4 campaign4  en 3/1/2016  20  none  NaN 
4 banner5 campaign5  en 4/1/2016  25  none  NaN 

print (df4['Value_1']) 
0 10.0 
1  5.0 
2 20.0 
3  NaN 
4  NaN 
Name: Value_1, dtype: float64 

df3['Value_1'] = df3['Value_1'].combine_first(df4['Value_1']).fillna(0).astype(int) 
print (df3) 
    Banner Campaign Country  Date Value_2 id_campaign Value_1 
0 banner1 campaign1  de 1/1/2016  5  none  10 
1 banner2 campaign2  it 2/1/2016  10  none  5 
2 banner3  none  de 1/1/2016  15  12345  20 
3 banner4 campaign4  en 3/1/2016  20  none  0 
4 banner5 campaign5  en 4/1/2016  25  none  0 
+0

它完美的作品:我只是需要一個額外的澄清,以便更好地瞭解加入。 如果df1不包含「國家」列,我會我會得到相同的df3?我會編輯我的問題。 – xxxvinxxx

+0

我覺得'df1'都是一樣的。也許一些錯誤的副本。 – jezrael

+0

好的,我嘗試更好地解釋我的解決方案:所以想法非常簡單 - 如果使用內部連接,所有密鑰都必須匹配。因此,如果使用3個鍵'on = ['Date','Campaign','Banner']'而有些不匹配,則省略。問題關鍵在'Campaign'列中。所以我創建了另一個'merge',其中省略了這個有問題的鍵,並且你得到另一個輸出'df4'。但是你只需要'Value_1'列,並且需要替換'df3 ['Value_1']'的所有值,其中'NaN'(不匹配)。所以它增加值'20',第一行和第二行的值不會被替換。如果我的解釋不清楚(我經常解釋不清),請給我一個問題。謝謝 – jezrael