सूचकांक द्वारा दो डेटाफ्रेम मर्ज करें


160

नमस्ते मेरे पास निम्नलिखित डेटाफ्रेम हैं:

> df1
  id begin conditional confidence discoveryTechnique  
0 278    56       false        0.0                  1   
1 421    18       false        0.0                  1 

> df2
   concept 
0  A  
1  B

कैसे प्राप्त करने के लिए मैं सूचकांकों पर विलय करता हूं:

  id begin conditional confidence discoveryTechnique   concept 
0 278    56       false        0.0                  1  A 
1 421    18       false        0.0                  1  B

मैं पूछता हूँ, क्योंकि यह मेरी समझ है कि है merge()यानी df1.merge(df2)स्तंभों का उपयोग करता मिलान करने के लिए। वास्तव में, यह कर मुझे मिलता है:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 491, in __init__
    self._validate_specification()
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 812, in _validate_specification
    raise MergeError('No common columns to perform merge on')
pandas.tools.merge.MergeError: No common columns to perform merge on

क्या सूचकांक पर विलय करना बुरा व्यवहार है? क्या यह असंभव है? यदि हां, तो मैं इंडेक्स को "इंडेक्स" नामक एक नए कॉलम में कैसे स्थानांतरित कर सकता हूं?

धन्यवाद


3
यह कोशिश करें:df1.join(df2)
मैक्स

क्या होगा यदि आप एक डेटाफ्रेम के सूचकांक और दूसरे डेटाफ्रेम के एक कॉलम से जुड़ना चाहते हैं। (मेरे दूसरे डेटाफ्रेम में एक कॉलम है जो पहली df में इण्डोल के साथ मेल खाता है।)
mikey

जवाबों:


321

उपयोग करें merge, जो आंतरिक रूप से डिफ़ॉल्ट रूप से शामिल है:

pd.merge(df1, df2, left_index=True, right_index=True)

या join, जिसे डिफ़ॉल्ट रूप से छोड़ दिया गया है:

df1.join(df2)

या concat, जो बाहरी रूप से डिफ़ॉल्ट रूप से शामिल होता है:

pd.concat([df1, df2], axis=1)

नमूने :

df1 = pd.DataFrame({'a':range(6),
                    'b':[5,3,6,9,2,4]}, index=list('abcdef'))

print (df1)
   a  b
a  0  5
b  1  3
c  2  6
d  3  9
e  4  2
f  5  4

df2 = pd.DataFrame({'c':range(4),
                    'd':[10,20,30, 40]}, index=list('abhi'))

print (df2)
   c   d
a  0  10
b  1  20
h  2  30
i  3  40

#default inner join
df3 = pd.merge(df1, df2, left_index=True, right_index=True)
print (df3)
   a  b  c   d
a  0  5  0  10
b  1  3  1  20

#default left join
df4 = df1.join(df2)
print (df4)
   a  b    c     d
a  0  5  0.0  10.0
b  1  3  1.0  20.0
c  2  6  NaN   NaN
d  3  9  NaN   NaN
e  4  2  NaN   NaN
f  5  4  NaN   NaN

#default outer join
df5 = pd.concat([df1, df2], axis=1)
print (df5)
     a    b    c     d
a  0.0  5.0  0.0  10.0
b  1.0  3.0  1.0  20.0
c  2.0  6.0  NaN   NaN
d  3.0  9.0  NaN   NaN
e  4.0  2.0  NaN   NaN
f  5.0  4.0  NaN   NaN
h  NaN  NaN  2.0  30.0
i  NaN  NaN  3.0  40.0

2
अच्छा। इसे पढ़ने वाले अन्य लोगों के लिए, यदि यह काम नहीं कर रहा है, तो देखें कि क्या आपको .transpose()अनुक्रमणिका को सिंक करने के लिए अपने डीएफएस में से एक की आवश्यकता है - यही मेरा मुद्दा था
जोना

2
बहुत बहुत धन्यवाद। बहुत बढ़िया जवाब। लेकिन क्यों concatजबकि joinऔर mergeनहीं कोष्ठक में df डाल दिया है ?
बोवेन लियू

@ बोवेन लियू संभव समवर्ती कई डेटाफ्रेम के लिए मेरी राय में सूची में जैसे dfs = [df1, df2, df3,... dfn]और फिरdf = pd. concat(dfs)
jezrael

@Jzrael क्या आप कृपया मेरे नए सवाल पर जांच कर सकते हैं stackoverflow.com/questions/57133848/…
Msquare

29

आप अनुक्रमणिका द्वारा संरेखित दो या अधिक DFs को समाप्‍त करने के लिए कंकट ([df1, df2, ...], अक्ष = 1) का उपयोग कर सकते हैं :

pd.concat([df1, df2, df3, ...], axis=1)

या कस्टम फ़ील्ड / इंडेक्स द्वारा समाप्‍त करने के लिए मर्ज करें :

# join by _common_ columns: `col1`, `col3`
pd.merge(df1, df2, on=['col1','col3'])

# join by: `df1.col1 == df2.index`
pd.merge(df1, df2, left_on='col1' right_index=True)

या इंडेक्स में शामिल होने के लिए शामिल हों:

 df1.join(df2)

6

डिफ़ॉल्ट रूप से:
joinएक कॉलम-वार लेफ्ट जॉइन
pd.mergeहै, एक कॉलम-वार इनर जॉइन
pd.concatएक पंक्ति-वार बाहरी जॉइन है

pd.concat:
Iterable तर्कों को लेता है। इस प्रकार, यह DataFrames को सीधे नहीं ले सकता (Use [df,df2])
DataFrame का आयाम अक्ष के साथ मेल खाना चाहिए

Joinऔर pd.merge:
DataFrame तर्क ले सकते हैं


5

एक मूर्खतापूर्ण बग जो मुझे मिला: अनुक्रमणिका dtypesभिन्न होने के कारण जोड़ विफल रहे । यह स्पष्ट नहीं था क्योंकि दोनों तालिकाएँ एक ही मूल तालिका की धुरी तालिकाएँ थीं। इसके बाद reset_index, सूचक जुपिटर में समान दिखे। यह केवल तभी प्रकाश में आया जब एक्सेल को बचाया गया ...

के साथ फिक्स्ड: df1[['key']] = df1[['key']].apply(pd.to_numeric)

उम्मीद है कि यह किसी को एक घंटे बचाता है!


4

यदि आप पांडा में दो डेटाफ्रेम शामिल करना चाहते हैं, तो आप केवल उपलब्ध विशेषताओं का उपयोग कर सकते हैं जैसे mergeया concatenate। उदाहरण के लिए अगर मेरे पास दो डेटाफ्रेम हैं df1और df2मैं उनके साथ जुड़ सकता हूं:

newdataframe=merge(df1,df2,left_index=True,right_index=True)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.