2017-07-28 44 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

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

相关问题