2013-05-16 6 views
7

मैं विशिष्ट कॉलम (कुंजी 1, की 2) पर दो डेटाफ्रेम मर्ज करना चाहता हूं और अन्य कॉलम (मान) के मानों को जोड़ना चाहता हूं।पांडस में 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 

मैं दो दृष्टिकोण की कोशिश की

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

मैं इस परिणाम चाहते हैं 63,210

दृष्टिकोण 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 

ऑप्स चेनिंग के लिए अपनी सहिष्णुता के आधार पर आप वैसे भी कई पंक्तियों पर इस तोड़ने के लिए चाहते हो सकता है, हालांकि (चार इस मामले में concat-groupby-select-sum) में, मेरी ऊपरी सीमा के करीब होने लगता है।

+0

ऐसा लगता है * उनकी प्रकृति की तरह एक और संक्षिप्त तरीका होना चाहिए ... एक मर्ज-टाइम एकत्रीकरण की तरह। –

+0

मैं एक जादुई फ़ंक्शन की तलाश में था जो सबकुछ अनुकूलित तरीके से करता है। – Laurie

+0

मैंने दृष्टिकोण 2 चुना है, और जितना संभव हो सके जंजीर सेशन क्योंकि यह इस तरह से तेज़ है। – Laurie

संबंधित मुद्दे