2013-05-16 18 views
7

特定の列(key1、key2)に2つのデータフレームを結合し、別の列(値)の値を合計したい。 SQL用語でPandasの2つのデータフレームを結合する:いくつかの列を結合する、他を集める

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 

は、私が欲しい:

アプローチ1

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

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

は、私は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 

私はこの結果をしたいです

アプローチ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

関連する問題