2014-03-05 71 views
1

這看起來像一個愚蠢的問題,但這一直困擾着我一段時間。熊貓合併列,但不是'鑰匙'列

DF1:

imp_type value 
1   abc 
2   def 
3   ghi 

DF2:

id   value2 
1   123 
2   345 
3   567 

Merginge 2個DF的:

df1.merge(df2, left_on='imp_type',right_on='id') 

收率:

imp_type value id value2 
1   abc  1  123 
2   def  2  345 
3   ghi  3  567 

然後我需要刪除id列,因爲它基本上是imp_type列的副本。爲什麼默認情況下合併拉入2個數據框之間的連接鍵?如果你不想拉入連接鍵,我會認爲至少應該有一個參數設置爲False。有沒有這樣的事情,或者我做錯了什麼?

+0

FWIW加入'.drop(「id」,1)'對我來說似乎不是那麼糟糕。 – DSM

+0

我知道,但這只是令人沮喪,因爲它不應該從一開始就以這種方式實施,而且在每次合併之後必須這樣做會加起來並感覺不舒服。 – ChrisArmstrong

回答

4

我同意這會很好,如果其中一列被刪除。當然,還有一個問題是什麼來命名剩餘的列。

無論如何,這裏是一個解決方法。簡單地重命名的一列,使得聯接的列(多個)具有相同的名稱:

In [23]: df1 = pd.DataFrame({'imp_type':[1,2,3], 'value':['abc','def','ghi']}) 

In [27]: df2 = pd.DataFrame({'id':[1,2,3], 'value2':[123,345,567]}) 

In [28]: df2.columns = ['imp_type','value2'] 

In [29]: df1.merge(df2, on='imp_type') 
Out[29]: 
    imp_type value value2 
0   1 abc  123 
1   2 def  345 
2   3 ghi  567 

重命名的列是一個有點疼痛,特別是相對於.drop('id', 1)(如DSM指出)。但是,如果您可以從一開始就安排連接的列具有相同的名稱,那麼df1.merge(df2, on='imp_type')將是最簡單的。

+0

好的提示。可能是我得到的最好答案,但如果還有其他選擇,我會再開放一段時間。 – ChrisArmstrong