2017-07-28 21 views
3

2つのDataFramesの下に異なる行数をマージできますが、Pandasには共通の列が1つありますか?異なる数の行を持つ2つの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 

結果DATAFRAMEは、以下のように必要があるように:

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'ですか? ... – Alexander

+0

@Alexander 'map'は一定時間のルックアップです。 'join'はそうではありません。 'map'は' CName'が 'df2'で一意でなければ動作しません。 'join'はいずれの方法でも動作します。 – 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

ありがとう!それは魅力のように動作します! –

関連する問題