2013-05-16 55 views
7

我想合併特定列(key1,key2)上的兩個數據幀,然後總結另一列(值)的值。在Pandas中合併2個數據框:在某些列上合併,總結其他列

>>> df1 = pd.DataFrame({'key1': range(4), 'key2': range(4), 'value': range(4)}) 
    key1 key2 value 
0  0  0  0 
1  1  1  1 
2  2  2  2 
3  3  3  3 

>>> df2 = pd.DataFrame({'key1': range(2, 6), 'key2': range(2, 6), 'noise': range(2, 6), 'value': range(10, 14)}) 
    key1 key2 noise value 
0  2  2  2  10 
1  3  3  3  11 
2  4  4  4  12 
3  5  5  5  13 

我想這樣的結果:

key1 key2 value 
0  0  0  0 
1  1  1  1 
2  2  2  12 
3  3  3  14 
4  4  4  12 
5  5  5  13 

在SQL方面,我想:

SELECT df1.key1, df1.key2, df1.value + df2.value AS value 
FROM df1 OUTER JOIN df2 ON key1, key2 

我嘗試兩種方法:

方法1

concatenated = pd.concat([df1, df2]) 
grouped = concatenated.groupby(['key1', 'key2'], as_index=False) 
summed = grouped.agg(np.sum) 
result = summed[['key1', 'key2', 'value']] 

方法2

joined = pd.merge(df1, df2, how='outer', on=['key1', 'key2'], suffixes=['_1', '_2']) 
joined = joined.fillna(0.0) 
joined['value'] = joined['value_1'] + joined['value_2'] 
result = joined[['key1', 'key2', 'value']] 

兩種方法給我想要的結果,但我不知道是否有一個更簡單的方法。

回答

8

我不知道簡單的,但你可以得到一個小更簡潔:

>>> pd.concat([df1, df2]).groupby(["key1", "key2"], as_index=False)["value"].sum() 
    key1 key2 value 
0  0  0  0 
1  1  1  1 
2  2  2  12 
3  3  3  14 
4  4  4  12 
5  5  5  13 

根據你的容忍鏈接OPS,你可能想反正要打破這種多行,但(4往往接近我的上限,在這種情況下concat-groupby-select-sum)。

+0

它看起來像他們應該是一個更簡潔的方式...就像一個合併時間聚合。 –

+0

我一直在尋找一種神奇的功能,它以最優化的方式完成一切。 – Laurie

+0

我選擇了方法2,並儘可能多地鏈接操作,因爲這樣更快。 – Laurie