2017-07-28 338 views
3

如何合併具有不同行數的兩個DataFrame,但在Pandas中具有一個公共列?合併具有不同行數的兩個DataFrame

DataFrame1:

CName PName Col1 Col2 
A1  XX1  34  22 
A2  XX2  23  44 
A1  XX3  11  12 
A2  XX4  23  43 
A1  XX5  42  76 
A3  XX6  15  56 
A4  XX7  33  45 
A5  XX8  223  87 
A5  XX9  12  56 
A5  XX10 87  34 
A5  XX11 6  23 
A4  XX12 55  33 

DataFrame2:

CName read unread 
A1  12  43 
A2  24  78 
A3  1  65 
A4  2  16 
A5  5  6 

從而使得到的數據框必須如下:

CName PName Col1 Col2 SumOfReadAndUnRead 
A1  XX1  34  22  55 
A2  XX2  23  44  102 
A1  XX3  11  12  55 
A2  XX4  23  43  102 
A1  XX5  42  76  55 
A3  XX6  15  56  66 
A4  XX7  33  45  18 
A5  XX8  223  87  11 
A5  XX9  12  56  11 
A5  XX10 87  34  11 
A5  XX11 6  23  11 
A4  XX12 55  33  18 

回答

4

看起來好像'CName'是在第二個數據幀是唯一的。我會用map。它應該更快。

df1.assign(
    SumOfReadAndUnRead=df1.CName.map(df2.set_index('CName').sum(1)) 
) 

    CName PName Col1 Col2 SumOfReadAndUnRead 
0  A1 XX1 34 22     55 
1  A2 XX2 23 44     102 
2  A1 XX3 11 12     55 
3  A2 XX4 23 43     102 
4  A1 XX5 42 76     55 
5  A3 XX6 15 56     66 
6  A4 XX7 33 45     18 
7  A5 XX8 223 87     11 
8  A5 XX9 12 56     11 
9  A5 XX10 87 34     11 
10 A5 XX11  6 23     11 
11 A4 XX12 55 33     18 

+0

是的,它是獨一無二的。非常感謝 !!! –

+0

爲什麼'map'?它稍快btw ... – Alexander

+0

@亞歷山大'地圖'是恆定的時間查詢。 'join'不是。除非'CName'在'df2'中唯一,否則'map'不起作用。 '加入'工作方式。 – piRSquared

4

總和df2讀和未讀列,然後將其加入到df1

>>> df1.join(df2.set_index('CName').sum(axis=1).to_frame('SumOfReadAndUnRead'), on='CName') 
    CName PName Col1 Col2 SumOfReadAndUnRead 
0  A1 XX1 34 22 55 
1  A2 XX2 23 44 102 
2  A1 XX3 11 12 55 
3  A2 XX4 23 43 102 
4  A1 XX5 42 76 55 
5  A3 XX6 15 56 66 
6  A4 XX7 33 45 18 
7  A5 XX8 223 87 11 
8  A5 XX9 12 56 11 
9  A5 XX10 87 34 11 
10 A5 XX11  6 23 11 
11 A4 XX12 55 33 18 
+0

非常感謝你!它的作品像魅力! –

相關問題