2012-08-15 18 views
54

मैं दो DataFrames मर्ज करना चाहता हूं, और इंडेक्स को मर्ज किए गए डेटासेट पर इंडेक्स के रूप में पहले फ्रेम से रखना चाहता हूं। हालांकि, जब मैं विलय करता हूं, परिणामी डेटाफ्रेम में पूर्णांक अनुक्रमणिका होती है। मैं कैसे निर्दिष्ट कर सकता हूं कि मैं इंडेक्स को बाएं डेटा फ्रेम से रखना चाहता हूं?पांडा मर्ज का उपयोग करते समय इंडेक्स को कैसे रखें

In [4]: a = pd.DataFrame({'col1': {'a': 1, 'b': 2, 'c': 3}, 
          'to_merge_on': {'a': 1, 'b': 3, 'c': 4}}) 

In [5]: b = pd.DataFrame({'col2': {0: 1, 1: 2, 2: 3}, 
          'to_merge_on': {0: 1, 1: 3, 2: 5}}) 

In [6]: a 
Out[6]: 
    col1 to_merge_on 
a  1   1 
b  2   3 
c  3   4 

In [7]: b 
Out[7]: 
    col2 to_merge_on 
0  1   1 
1  2   3 
2  3   5 

In [8]: a.merge(b, how='left') 
Out[8]: 
    col1 to_merge_on col2 
0  1   1 1.0 
1  2   3 2.0 
2  3   4 NaN 

In [9]: _.index 
Out[9]: Int64Index([0, 1, 2], dtype='int64') 

संपादित करें: उदाहरण के कोड है कि हो सकता है पर स्विच किया आसानी से

+29

यह पांडा के बारे में शीर्ष 10 सबसे कमजोर चीजों में होना चाहिए ... ... सूचकांक को खोने का कारण कभी समझ में आता है? – Corone

उत्तर

69
In [5]: a.reset_index().merge(b, how="left").set_index('index') 
Out[5]: 
     col1 to_merge_on col2 
index 
a   1   1  1 
b   2   3  2 
c   3   4 NaN 
+1

बहुत चालाक। a.merge (बी, कैसे = "बाएं")। set_index (a.index) भी काम करता है, लेकिन यह कम मजबूत लगता है (क्योंकि इसका पहला भाग सूचकांक मानों को इससे पहले कि उन्हें रीसेट कर देता है।) – DanB

+7

इस विशेष के लिए मामला, वे बराबर हैं। लेकिन कई मर्ज ऑपरेशंस के लिए, परिणामी फ्रेम में मूल 'ए' फ्रेम की तुलना में पंक्तियों की संख्या समान नहीं है। रीसेट_इंडेक्स इंडेक्स को नियमित स्तंभ में सेट करता है और इस कॉलम से set_index को मर्ज करने के बाद डुप्लीकेट/हटाए जाने पर पंक्तियों की देखभाल करते समय विलय भी ख्याल रखता है। –

+0

मुझे नहीं पता था कि मेरा समाधान क्यों टूट जाएगा, लेकिन मुझे लगा कि यह होगा। Reset_index() और फिर set_index() समाधान बहुत समझ में आता है। धन्यवाद। – DanB

1

reproduced वहाँ एक गैर pd.merge समाधान है। map और set_index

In [1744]: a.assign(col2=a['to_merge_on'].map(b.set_index('to_merge_on')['col2'])) 
Out[1744]: 
    col1 to_merge_on col2 
a  1   1 1.0 
b  2   3 2.0 
c  3   4 NaN 

का उपयोग करते हुए और, सूचकांक के लिए एक डमी index नाम परिचय नहीं है।

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