2017-05-02 82 views
1

我有兩個數據幀D1和D2。兩者大小不同,但有一些關係。 D1有一列「ID」具有相同ID的多個實例,D2只有一個實例。那麼我怎樣才能將這兩個數據框連接在一起呢?合併不同長度的兩個數據幀,在具有不同實例數的特定列上

D1:        D2: 
    ID val1 val2     ID Target 
    1 x  y     1  0 
    1 x  y     2  1 
    2 a  b 
    2 a  c 

所以在這裏我需要從D2

在D1的新列稱爲目標,每行D1與相應的值
ID val1 val2 Target 
    1 x  y  0 
    1 x  y  0 
    2 a  b  1 
    2 a  c  1 

回答

2

選項1:join
此解決方案要求你設置的D2索引,並使用on參數

D1.join(D2.set_index('ID'), on='ID') 

    ID val1 val2 Target 
0 1 x y  0 
1 1 x y  0 
2 2 a b  1 
3 2 a c  1 

注:如果D2不包括所有值在D1.ID中,並且您希望D1的行的值爲true,則使用th e how='left'選項。

D1.join(D2.set_index('ID'), on='ID', how='left') 

從評論:

爲什麼這個要求設置D2的指數?其他答案不這樣做。 - ErikE

@ErikE這是合併和連接的區別。 pandas.DataFrame.merge默認會對列值進行合併。雖然連接默認情況下查看索引。我可以通過指定要用on ='ID'加入的列來覆蓋連接行爲。但是,該覆蓋能力僅限於左側對象。所以,我必須設置正確對象的索引才能正確執行。 - piRSquared

選項2:map + assign
該溶液要拐彎D2弄成dict像,一個pd.Series與索引是'ID' S和值作爲'Target'mapD1上的'ID'列轉換爲新值,我們將其分配給assign的新列。

D1.assign(Target=D1.ID.map(D2.set_index('ID').Target)) 


    ID val1 val2 Target 
0 1 x y  0 
1 1 x y  0 
2 2 a b  1 
3 2 a c  1 
+0

無論誰低估這個答案,我會很高興知道爲什麼我可以改進答案或解決任何問題。這是完成這項任務的兩種非常合適的方法。 – piRSquared

+1

爲什麼需要設置'D2'的索引?其他答案不這樣做。 – ErikE

+1

@ErikE這是'merge'和'join'之間的區別。 'pandas.DataFrame.merge'默認會對列值進行合併。雖然'join'默認查看索引。我可以用'on ='ID''指定一個要加入的列來覆蓋'join'行爲。但是,這種覆蓋能力僅限於「左」對象。所以,我必須設置「right」對象的索引才能正確執行。 – piRSquared

3

你想離開merge

In [36]: 
D1.merge(D2, on='ID', how='left') 

Out[36]: 
    ID val1 val2 Target 
0 1 x y  0 
1 1 x y  0 
2 2 a b  1 
3 2 a c  1 

這與匹配公共列'ID'和左合併類似於SQL樣式合併

0
D1.merge(D2, how='left', on="ID") 

這相當於SQL左連接。這意味着D1的每個值都被保留,並且任何與D2的ID相匹配的值都將被添加。

相關問題