2013-05-16 34 views
7

Tôi muốn kết hợp hai dataframes trên các cột cụ thể (key1, key2) và tổng hợp các giá trị cho một cột (giá trị) khác.hợp nhất 2 dataframes trong Pandas: tham gia vào một số cột, tổng hợp các số khác

>>> 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 

Tôi muốn kết quả này:

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 

Về SQL, tôi muốn:

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

Tôi đã thử hai cách tiếp cận:

cách tiếp cận 1

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

cách tiếp cận 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']] 

Cả hai phương pháp cho kết quả tôi muốn, nhưng tôi tự hỏi, nếu có một cách đơn giản hơn.

Trả lời

8

Tôi không biết về đơn giản hơn, nhưng bạn có thể nhận được một chút ngắn gọn hơn:

>>> 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 

Tùy thuộc vào sự khoan dung của bạn cho chaining ops, bạn có thể muốn phá vỡ này lên nhiều dòng dù sao, mặc dù (bốn có xu hướng gần với giới hạn trên của tôi, trong trường hợp này là concat-groupby-select-sum).

+0

Nó * có vẻ * giống như của họ phải là một cách ngắn gọn hơn ... như một tập hợp thời gian hợp nhất. –

+0

Tôi đang tìm kiếm một chức năng phép thuật làm mọi thứ một cách tối ưu. – Laurie

+0

Tôi đã chọn cách tiếp cận 2, và các chuỗi bị xích càng nhiều càng tốt vì nó nhanh hơn theo cách này. – Laurie

Các vấn đề liên quan