2013-01-03 26 views
12

में एकल-अनुक्रमित डेटा फ्रेम के साथ बहु-अनुक्रमित मर्ज करें मेरे पास दो डेटा फ्रेम हैं। DF1 बहु अनुक्रमित है:पांडा

   value 
first second  
a  x   0.471780 
     y   0.774908 
     z   0.563634 
b  x   -0.353756 
     y   0.368062 
     z   -1.721840 

और df2:

 value 
first 
a  10 
b  20 

मैं कैसे, बहु इंडेक्सों का केवल एक ही साथ दो डेटा फ्रेम विलय कर सकते हैं इस मामले 'पहली' सूचकांक में? वांछित आउटपुट होगा:

   value1  value2 
first second  
a  x   0.471780 10 
     y   0.774908 10 
     z   0.563634 10 
b  x   -0.353756 20 
     y   0.368062 20 
     z   -1.721840 20 

उत्तर

9

आप इस्तेमाल कर सकते हैं get_level_values:

firsts = df1.index.get_level_values('first') 
df1['value2'] = df2.ix[firsts].values 

नोट: यदि आप लगभग यहाँ एक join कर (DF1 है MultiIndex को छोड़कर) ... इसलिए भी हो सकते हैं इसका वर्णन करने के लिए एक साफ तरीका ...

एक उदाहरण (तुम्हारे पास क्या है के समान) में:

df1 = pd.DataFrame([['a', 'x', 0.123], ['a','x', 0.234], 
        ['a', 'y', 0.451], ['b', 'x', 0.453]], 
        columns=['first', 'second', 'value1'] 
        ).set_index(['first', 'second']) 
df2 = pd.DataFrame([['a', 10],['b', 20]], 
        columns=['first', 'value']).set_index(['first']) 

firsts = df1.index.get_level_values('first') 
df1['value2'] = df2.ix[firsts].values 

In [5]: df1 
Out[5]: 
       value1 value2 
first second     
a  x  0.123  10 
     x  0.234  10 
     y  0.451  10 
b  x  0.453  20 
+0

आप कर सकते हैं * लगभग * इस तरह विलय: 'df1.merge (df2, left_on = df1.index.get_level_values ​​('पहली'), right_on = df2.index.get_level_values ​​('पहली'))' –

2

.ix वाक्य रचना reindexing के लिए एक शक्तिशाली शॉर्टकट है, लेकिन इस मामले में आप वास्तव में किसी भी संयुक्त पंक्तियों/स्तंभ reindexing नहीं कर रहे हैं के रूप में यह, तब

df1 = pd.DataFrame([['a', 'x', 0.123], ['a','x', 0.234], 
        ['a', 'y', 0.451], ['b', 'x', 0.453]], 
        columns=['first', 'second', 'value1'] 
        ).set_index(['first', 'second']) 
df2 = pd.DataFrame([['a', 10],['b', 20]], 
        columns=['first', 'value']).set_index(['first']) 

:

हेडन से तैयारी: थोड़ा अधिक सुंदर ढंग से reindexing बस का उपयोग कर के साथ (मेरी विनम्र स्वाद के लिए) किया जा सकता है इस इस तरह दिखता है IPython में:

In [4]: df1 
Out[4]: 
       value1 
first second   
a  x  0.123 
     x  0.234 
     y  0.451 
b  x  0.453 

In [5]: df2 
Out[5]: 
     value 
first  
a   10 
b   20 

In [7]: df2.reindex(df1.index, level=0) 
Out[7]: 
       value 
first second  
a  x   10 
     x   10 
     y   10 
b  x   20 

In [8]: df1['value2'] = df2.reindex(df1.index, level=0) 

In [9]: df1 
Out[9]: 
       value1 value2 
first second     
a  x  0.123  10 
     x  0.234  10 
     y  0.451  10 
b  x  0.453  20 

आप अनुक्रमणः विधि में उपयोग करने के लिए किस स्तर के लिए mnemotechnic: यह स्तर है कि आप पहले से ही बड़ा सूचकांक में शामिल करने के लिए कहा गया है। तो, इस मामले में df2 में पहले से ही df1.index से कवर स्तर 0 था।

4

the documentation के अनुसार, पांडा 0.14 के रूप में, आप केवल सिंगल-इंडेक्स और मल्टीइंडेक्स डेटाफ्रेम में शामिल हो सकते हैं। यह आम इंडेक्स नाम से मेल खाएगा। how तर्क 'inner' और 'outer' के साथ अपेक्षित कार्य करता है, हालांकि दिलचस्प रूप से यह 'left' और 'right' (यह एक बग हो सकता है?) के लिए उलट दिया जाता है।

df1 = pd.DataFrame([['a', 'x', 0.471780], ['a','y', 0.774908], ['a', 'z', 0.563634], 
        ['b', 'x', -0.353756], ['b', 'y', 0.368062], ['b', 'z', -1.721840], 
        ['c', 'x', 1], ['c', 'y', 2], ['c', 'z', 3], 
        ], 
        columns=['first', 'second', 'value1'] 
        ).set_index(['first', 'second']) 
df2 = pd.DataFrame([['a', 10], ['b', 20]], 
        columns=['first', 'value2']).set_index(['first']) 

print(df1.join(df2, how='inner')) 
       value1 value2 
first second     
a  x  0.471780  10 
     y  0.774908  10 
     z  0.563634  10 
b  x  -0.353756  20 
     y  0.368062  20 
     z  -1.721840  20 
संबंधित मुद्दे