मुख्य सामग्री पर जाएँ

pandas में DataFrames को जोड़ना: merge(), concat() और join()

व्यावहारिक उदाहरणों के साथ concat(), merge() और join() का उपयोग करके pandas में DataFrames को जोड़ना और मर्ज करना सीखें।
· 13 मि॰ पढ़ें

AI के साथ खोजें

क्या आपने कभी Kaggle चैलेंज हल करने की कोशिश की है? अगर हां, तो आपने देखा होगा कि ज्यादातर चैलेंजों में आपको जो डेटा मिलता है वह कई फाइलों में बंटा होता है, और कुछ कॉलम एक से अधिक फाइलों में मौजूद होते हैं। तब आपके दिमाग में सबसे पहली बात क्या आती है? जाहिर है—उन्हें जोड़ना!

इस ट्यूटोरियल में, आप कुछ मानक pandas जॉइनिंग तकनीकों का अभ्यास करेंगे। खास तौर पर, आप सीखेंगे:

  • पंक्ति और कॉलम के साथ DataFrames को कंकैटिनेट करना।
  • विभिन्न जॉइन लॉजिक जैसे लेफ्ट-जॉइन, इनर-जॉइन आदि द्वारा विशिष्ट कीज़ पर DataFrames को मर्ज करना।
  • इंडेक्स द्वारा DataFrames को जॉइन करना।
  • pandas में उपलब्ध टाइम-सीरीज़ फ्रेंडली मर्जिंग

रास्ते में, आप कुछ ऐसे ट्रिक्स भी सीखेंगे जिनकी जरूरत जॉइन करने से पहले और बाद में पड़ती है।

संक्षेप में

  • pd.concat() का उपयोग DataFrames को वर्टिकली (पंक्तियाँ) या हॉरिजोंटली (कॉलम) स्टैक करने के लिए करें
  • pd.merge() का उपयोग कॉमन कॉलम्स पर DataFrames को जोड़ने के लिए करें, बिल्कुल SQL जोइन्स जैसा
  • how पैरामीटर से जॉइन का प्रकार तय करें: 'inner', 'outer', 'left', या 'right'
  • इंडेक्स-आधारित जॉइनिंग के लिए .join() का उपयोग करें
  • टाइम-सीरीज़ डेटा में, जहाँ नजदीकी-की मिलान चाहिए, वहाँ pd.merge_asof() का उपयोग करें

pandas में Joining

DataFrames को जोड़ना और मर्ज करना डेटा विश्लेषण और मशीन लर्निंग कार्य शुरू करने की मूल प्रक्रिया है। यह उन टूलकिट्स में से एक है जिसे हर डेटा एनालिस्ट या डेटा साइंटिस्ट को सीखना चाहिए, क्योंकि लगभग हर मामले में डेटा कई स्रोतों और फाइलों से आता है। आपको किसी न किसी जॉइन लॉजिक से सारा डेटा एक जगह लाना पड़ सकता है और फिर अपना विश्लेषण शुरू करना होगा। SQL जोइन्स के साथ काम करने वाले लोग इस कार्य का महत्व जानते हैं। भले ही आप किसी डेटा पर मशीन लर्निंग मॉडल बनाना चाहते हों, आपको कई csv फाइलों को एक ही DataFrame में मर्ज करना पड़ सकता है।

खुशकिस्मती से, आपके पास पायथन की सबसे लोकप्रिय लाइब्रेरी pandas है! pandas इंडेक्स के लिए विभिन्न सेट-लॉजिक और जॉइन/मर्ज-टाइप ऑपरेशंस के मामले में रिलेशनल अलजेब्रा फंक्शनैलिटी के साथ Series और DataFrames को आसानी से जोड़ने के लिए कई सुविधाएँ प्रदान करता है।

इस ट्यूटोरियल का कोड ऑनलाइन चलाएं और संपादित करें

कोड चलाएं

pandas Concatenate

शुरू करें उस लाइब्रेरी को इंपोर्ट करके जिसका उपयोग आप पूरे ट्यूटोरियल में करेंगे: pandas

import pandas as pd

इस ट्यूटोरियल में आप सभी ऑपरेशंस उन्हीं डमी DataFrames पर करेंगे जिन्हें आप बनाएंगे। एक DataFrame बनाने के लिए, आप इस तरह का Python डिक्शनरी उपयोग कर सकते हैं:

dummy_data1 = {
        'id': ['1', '2', '3', '4', '5'],
        'Feature1': ['A', 'C', 'E', 'G', 'I'],
        'Feature2': ['B', 'D', 'F', 'H', 'J']}

यहाँ, डिक्शनरी dummy_data1 की कीज़ कॉलम नाम हैं, और सूचियों में मौजूद मान प्रत्येक ऑब्ज़र्वेशन या पंक्ति के अनुरूप डेटा है। इसे pandas DataFrame में बदलने के लिए, आप pandas की DataFrame() फ़ंक्शन के साथ columns आर्ग्युमेंट का उपयोग करेंगे ताकि अपने कॉलम्स के नाम दे सकें:

df1 = pd.DataFrame(dummy_data1, columns = ['id', 'Feature1', 'Feature2'])

df1
 idFeature1Feature2
01AB
12CD
23EF
34GH
45IJ

जैसा कि आप देख सकते हैं, अब आपके पास तीन कॉलम—id, Feature1 और Feature2—के साथ एक DataFrame है। एक अतिरिक्त बिना-नाम वाला कॉलम भी है जिसे pandas पंक्तियों के लेबल के रूप में स्वतः बनाता है। पिछले DataFrame df1 की तरह ही, आप दो और DataFrames df2 और df3 बनाएंगे:

dummy_data2 = {
        'id': ['1', '2', '6', '7', '8'],
        'Feature1': ['K', 'M', 'O', 'Q', 'S'],
        'Feature2': ['L', 'N', 'P', 'R', 'T']}
df2 = pd.DataFrame(dummy_data2, columns = ['id', 'Feature1', 'Feature2'])

df2
 idFeature1Feature2
01KL
12MN
26OP
37QR
48ST
dummy_data3 = {
        'id': ['1', '2', '3', '4', '5', '7', '8', '9', '10', '11'],
        'Feature3': [12, 13, 14, 15, 16, 17, 15, 12, 13, 23]}
df3 = pd.DataFrame(dummy_data3, columns = ['id', 'Feature3'])

df3
 idFeature3
0112
1213
2314
3415
4516
5717
6815
7912
81013
91123

 concat()

सिर्फ DataFrames को पंक्तियों के साथ जोड़ने के लिए आप pandas में concat() फ़ंक्शन का उपयोग कर सकते हैं। आपको concat() फ़ंक्शन को आर्ग्युमेंट के रूप में DataFrames के नामों की सूची पास करनी होगी:

df_row = pd.concat([df1, df2])

df_row
 idFeature1Feature2
01AB
12CD
23EF
34GH
45IJ
01KL
12MN
26OP
37QR
48ST

आप देख सकते हैं कि अब df1 और df2 दोनों DataFrames पंक्तियों के साथ जोड़कर एक ही DataFrame df_row बन गए हैं। हालांकि, पंक्ति लेबल गलत लग रहे हैं। अगर आप चाहते हैं कि जॉइन के अनुसार पंक्ति लेबल अपने-आप समायोजित हो जाएँ, तो concat() फ़ंक्शन कॉल करते समय ignore_index आर्ग्युमेंट को True सेट करें:

df_row_reindex = pd.concat([df1, df2], ignore_index=True)

df_row_reindex
 idFeature1Feature2
01AB
12CD
23EF
34GH
45IJ
51KL
62MN
76OP
87QR
98ST

अब पंक्ति लेबल सही हैं!

pandas आपको एक और विकल्प देता है कि कंकैटिनेशन के बाद DataFrames को किसी कुंजी से लेबल कर दें, ताकि आपको पता रहे कि कौन-सा डेटा किस DataFrame से आया है। इसके लिए आप अतिरिक्त आर्ग्युमेंट keys पास कर सकते हैं, जिसमें DataFrames के लेबल नामों की सूची होती है। यहाँ आप वही कंकैटिनेशन करेंगे, लेकिन df1 और df2 के लिए क्रमशः x और y कीज़ के साथ।

frames = [df1,df2]
df_keys = pd.concat(frames, keys=['x', 'y'])

df_keys
  idFeature1Feature2
x01AB
12CD
23EF
34GH
45IJ
y01KL
12MN
26OP
37QR
48ST

कीज़ बताने से किसी विशेष DataFrame के अनुरूप डेटा निकालना भी आसान हो जाता है। आप loc मेथड का उपयोग करके उस DataFrame df2 का डेटा निकाल सकते हैं जिसका लेबल y था:

df_keys.loc['y']
 idFeature1Feature2
01KL
12MN
26OP
37QR
48ST

आप concat() को डिक्शनरी भी पास कर सकते हैं; ऐसे में (जब तक अन्य keys निर्दिष्ट न हों) डिक्शनरी कीज़ ही keys आर्ग्युमेंट के रूप में उपयोग होंगी:

pieces = {'x': df1, 'y': df2}

df_piece = pd.concat(pieces)

df_piece
  idFeature1Feature2
x01AB
12CD
23EF
34GH
45IJ
y01KL
12MN
26OP
37QR
48ST

ध्यान देने योग्य है कि concat() डेटा की एक पूरी कॉपी बनाता है, और इसे बार-बार उपयोग करना प्रदर्शन पर बड़ा असर डाल सकता है। बड़े पैमाने के डेटा ऑपरेशंस के लिए, हाई-परफॉर्मेंस डेटा मैनिप्युलेशन के लिए pandas 2.0 बनाम polars का अन्वेषण करें। यदि आपको कई डेटासेट्स पर यह ऑपरेशन करना है, तो लिस्ट कॉम्प्रिहेंशन का उपयोग करें।

frames = [ process_your_file(f) for f in files ]
result = pd.concat(frames)

कॉलम के साथ DataFrames को जोड़ने के लिए, आप axis पैरामीटर को 1 के रूप में निर्दिष्ट कर सकते हैं:

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

df_col
 idFeature1Feature2idFeature1Feature2
01AB1KL
12CD2MN
23EF6OP
34GH7QR
45IJ8ST

pandas Merge DataFrames

DataFrames से संबंधित एक और सर्वव्यापी ऑपरेशन है मर्जिंग। दो DataFrames एक ही एंटिटी के बारे में अलग-अलग तरह की जानकारी रख सकते हैं और किसी कॉमन फीचर/कॉलम से जुड़े हो सकते हैं। इन DataFrames को जोड़ने के लिए, pandas concat(), merge(), join() आदि जैसे कई फ़ंक्शंस देता है। इस सेक्शन में, आप pandas के merge() फ़ंक्शन का उपयोग करना सीखेंगे।

आप df_row (जिसे आपने df1 और df2 को पंक्तियों के साथ कंकैटिनेट करके बनाया था) और df3 को कॉमन कॉलम (या की) id पर जॉइन कर सकते हैं। ऐसा करने के लिए, merge() फ़ंक्शन को DataFrames के नाम और अतिरिक्त आर्ग्युमेंट on में कॉमन कॉलम का नाम, यहाँ id, पास करें:

df_merge_col = pd.merge(df_row, df3, on='id')

df_merge_col
 idFeature1Feature2Feature3
01AB12
11KL12
22CD13
32MN13
43EF14
54GH15
65IJ16
77QR17
88ST15

आप देख सकते हैं कि अब DataFrames कॉमन id कॉलम में मौजूद कॉमन मानों के आधार पर एक DataFrame में मर्ज हो गए हैं। उदाहरण के लिए, यहाँ id मान 1 df_row में A, B और K, L दोनों के साथ मौजूद था, इसलिए यह id अंतिम DataFrame df_merge_col में दो बार आई और Feature3 का मान 12 (जो df3 से आया) दोहराया गया।

ऐसा हो सकता है कि जिन कॉलम्स पर आप DataFrames को मर्ज करना चाहते हैं उनके नाम अलग हों (जैसा कि यहाँ नहीं है)। ऐसे मर्ज के लिए, आपको left_on में लेफ्ट DataFrame का कॉलम नाम और right_on में राइट DataFrame का कॉलम नाम निर्दिष्ट करना होगा, जैसे:

df_merge_difkey = pd.merge(df_row, df3, left_on='id', right_on='id')

df_merge_difkey
 idFeature1Feature2Feature3
01AB12
11KL12
22CD13
32MN13
43EF14
54GH15
65IJ16
77QR17
88ST15

आप pd.concat() का उपयोग करके DataFrame में पंक्तियाँ भी जोड़ सकते हैं। पहले पंक्ति डेटा के साथ एक नया DataFrame बनाएँ, फिर उसे मूल DataFrame के साथ कंकैटिनेट करें:

add_row = pd.DataFrame([['10', 'X1', 'X2', 'X3']], 
                       columns=['id', 'Feature1', 'Feature2', 'Feature3'])

df_add_row = pd.concat([df_merge_col, add_row], ignore_index=True)

df_add_row
 idFeature1Feature2Feature3
01AB12
11KL12
22CD13
32MN13
43EF14
54GH15
65IJ16
77QR17
88ST15
910X1X2X3

pandas जॉइन के प्रकार

इस सेक्शन में, आप किसी कॉमन कॉलम/की के आधार पर pandas DataFrames को मर्ज करने के लिए उपलब्ध विभिन्न जॉइन लॉजिक का अभ्यास करेंगे। इन जोइन्स के पीछे की लॉजिक वही है जो SQL में टेबल्स को जॉइन करते समय होती है। अगर आप SQL में inner बनाम outer जोइन्स से परिचित हैं, तो ये कॉन्सेप्ट्स आपको जान-पहचान के लगेंगे।

Join TypeSQL EquivalentResultUse Case
innerINNER JOINसिर्फ दोनों DataFrames के मिलते-जुलते रोजब आप सिर्फ वे रिकॉर्ड चाहते हैं जो दोनों टेबल्स में मौजूद हों
leftLEFT OUTER JOINलेफ्ट की सभी पंक्तियाँ + राइट की मिलान वालीप्राइमरी DataFrame के सभी रिकॉर्ड रखना
rightRIGHT OUTER JOINराइट की सभी पंक्तियाँ + लेफ्ट की मिलान वालीसेकेंडरी DataFrame के सभी रिकॉर्ड रखना
outerFULL OUTER JOINदोनों DataFrames की सभी पंक्तियाँजब आपको दोनों टेबल्स का पूर्ण यूनियन चाहिए

फुल आउटर जॉइन

FULL OUTER JOIN लेफ्ट और राइट आउटर जॉइन दोनों के नतीजों को मिलाता है। जॉइन किया गया DataFrame दोनों DataFrames के सभी रिकॉर्ड्स रखेगा और किसी भी तरफ मिलान न होने पर NaN मान भर देगा। आप merge() फ़ंक्शन में how आर्ग्युमेंट को outer सेट करके फुल आउटर जॉइन कर सकते हैं:

df_outer = pd.merge(df1, df2, on='id', how='outer')

df_outer
 idFeature1_xFeature2_xFeature1_yFeature2_y
01ABKL
12CDMN
23EFNaNNaN
34GHNaNNaN
45IJNaNNaN
56NaNNaNOP
67NaNNaNQR
78NaNNaNST

आप देख सकते हैं कि परिणामस्वरूप DataFrame में दोनों टेबल्स की सभी एंट्रियाँ हैं और किसी भी तरफ मिलान न होने पर NaN मान हैं। एक और बात ध्यान देने योग्य है कि कॉलम नामों के साथ जो सफिक्स जुड़ा है जिससे पता चलता है कि कौन-सा कॉलम किस DataFrame से आया। डिफ़ॉल्ट सफिक्स x और y होते हैं, लेकिन आप merge() फ़ंक्शन में suffixes आर्ग्युमेंट देकर इन्हें बदल सकते हैं:

df_suffix = pd.merge(df1, df2, left_on='id',right_on='id',how='outer',suffixes=('_left','_right'))

df_suffix
 idFeature1_leftFeature2_leftFeature1_rightFeature2_right
01ABKL
12CDMN
23EFNaNNaN
34GHNaNNaN
45IJNaNNaN
56NaNNaNOP
67NaNNaNQR
78NaNNaNST

इनर जॉइन

INNER JOIN केवल वही रिकॉर्ड देता है जो DataFrame A और DataFrame B दोनों में मिलते हैं। इनर जॉइन करने के लिए merge() फ़ंक्शन के how आर्ग्युमेंट में inner पास करें:

df_inner = pd.merge(df1, df2, on='id', how='inner')

df_inner
 idFeature1_xFeature2_xFeature1_yFeature2_y
01ABKL
12CDMN

राइट जॉइन

RIGHT JOIN DataFrame B (राइट DataFrame) के सभी रिकॉर्ड देता है, और जहाँ मिलान उपलब्ध है वहाँ DataFrame A (लेफ्ट DataFrame) के मिलते-जुलते रिकॉर्ड्स दिखाता है। अगर मिलान नहीं है, तो राइट साइड पर null होगा। राइट जॉइन करने के लिए merge() के how आर्ग्युमेंट में right पास करें:

df_right = pd.merge(df1, df2, on='id', how='right')

df_right
 idFeature1_xFeature2_xFeature1_yFeature2_y
01ABKL
12CDMN
26NaNNaNOP
37NaNNaNQR
48NaNNaNST

लेफ्ट जॉइन

LEFT JOIN DataFrame A (लेफ्ट DataFrame) के सभी रिकॉर्ड देता है, और जहाँ मिलान उपलब्ध है वहाँ DataFrame B (राइट DataFrame) के मिलते-जुलते रिकॉर्ड्स दिखाता है। अगर मिलान नहीं है, तो लेफ्ट साइड पर null होगा। लेफ्ट जॉइन करने के लिए merge() के how आर्ग्युमेंट में left पास करें:

df_left = pd.merge(df1, df2, on='id', how='left')

df_left
 idFeature1_xFeature2_xFeature1_yFeature2_y
01ABKL
12CDMN
23EFNaNNaN
34GHNaNNaN
45IJNaNNaN

इंडेक्स पर जॉइनिंग

कभी-कभी आपको इंडेक्सेस या पंक्ति लेबल्स पर जॉइन करना पड़ सकता है। ऐसा करने के लिए, आपको right_index (राइट DataFrame के इंडेक्सेस के लिए) और left_index (लेफ्ट DataFrame के इंडेक्सेस के लिए) को True सेट करना होगा:

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

df_index
 id_xFeature1_xFeature2_xid_yFeature1_yFeature2_y
01AB1KL
12CD2MN
23EF6OP
34GH7QR
45IJ8ST

pandas Join

pandas का DataFrame.join() मेथड यूनिक इंडेक्सेस पर DataFrames को जॉइन करने के लिए उपयोग होता है। आप वैकल्पिक आर्ग्युमेंट `on` का उपयोग करके कॉलम नामों को इंडेक्स पर जॉइन कर सकते हैं और how आर्ग्युमेंट से दो ऑब्जेक्ट्स के बीच ऑपरेशन नियंत्रित कर सकते हैं। डिफ़ॉल्ट रूप से, यह इनर जॉइन का उपयोग करेगा। 

pandas में दो DataFrames जॉइन करना

आइए .join का उपयोग करके दो डेटा फ्रेम्स को जॉइन करें। हमने कॉलम ओवरलैपिंग एरर से बचने के लिए `lsuffix` और `rsuffix` प्रदान किए हैं। यह कॉलम पर नहीं बल्कि इंडेक्स पर जॉइन करता है, इसलिए हमें या तो ‘id’ कॉलम बदलना होगा या सफिक्स देना होगा।

df2.join(df3, lsuffix='_left', rsuffix='_right')

 id_leftFeature1Feature2id_rightFeature3
01KL112
12MN213
26OP314
37QR415
48ST516

हम `on` आर्ग्युमेंट का उपयोग करके कॉलम्स को इंडेक्स पर भी जॉइन कर सकते हैं। जॉइन सफलतापूर्वक लागू करने के लिए, हमें df3 के ‘id’ कॉलम को इंडेक्स में सेट करना होगा और `on` आर्ग्युमेंट में ‘id’ कॉलम देना होगा। डिफ़ॉल्ट रूप से, यह लेफ्ट जॉइन का उपयोग करेगा।   

df2.join(df3.set_index('id'), on='id')

 idFeature1Feature2Feature3
01KL12.0
12MN13.0
26OPNaN
37QR17.0
48ST15.0

बिल्कुल merge फ़ंक्शन की तरह, हम `how` आर्ग्युमेंट देकर join का ऑपरेशन बदल सकते हैं। हमारे मामले में, हम इनर जॉइन का उपयोग करेंगे। 

df2.join(df3.set_index('id'), on='id', how = "inner")

 id_leftFeature1Feature2Feature3
01KL12
12MN13
37QR17
48ST15

टाइम-सीरीज़ फ्रेंडली मर्जिंग

pandas टाइम-सीरीज़ DataFrames को मर्ज करने के लिए विशेष फ़ंक्शंस प्रदान करता है। शायद सबसे उपयोगी और लोकप्रिय merge_asof() फ़ंक्शन है। merge_asof() एक ऑर्डर्ड लेफ्ट-जॉइन जैसा है, फर्क यह है कि आप बराबर कीज़ की बजाय निकटतम की पर मैच करते हैं। लेफ्ट DataFrame की प्रत्येक पंक्ति के लिए, आप राइट DataFrame की वह अंतिम पंक्ति चुनते हैं जिसकी on की लेफ्ट की की तुलना में कम हो। दोनों DataFrames को की के आधार पर सॉर्ट किया हुआ होना चाहिए।

वैकल्पिक रूप से asof मर्ज ग्रुप-वाइज मर्ज भी कर सकता है। यह on की पर निकटतम मैच के अलावा by की पर समानता से मैच करता है।

उदाहरण के लिए, आपके पास ट्रेड्स और कोट्स हो सकते हैं, और आप उन्हें asof मर्ज करना चाहते हैं। यहाँ लेफ्ट DataFrame trades है और राइट DataFrame quotes है। इन्हें time की पर asof मर्ज किया गया है और उनके टिकर सिंबल के आधार पर ग्रुप-वाइज मर्ज किया गया है।

trades = pd.DataFrame({
    'time': pd.to_datetime(['20160525 13:30:00.023',
                            '20160525 13:30:00.038',
                            '20160525 13:30:00.048',
                            '20160525 13:30:00.048',
                            '20160525 13:30:00.048']),
    'ticker': ['MSFT', 'MSFT','GOOG', 'GOOG', 'AAPL'],
    'price': [51.95, 51.95,720.77, 720.92, 98.00],
    'quantity': [75, 155,100, 100, 100]},
    columns=['time', 'ticker', 'price', 'quantity'])

quotes = pd.DataFrame({
    'time': pd.to_datetime(['20160525 13:30:00.023',
                            '20160525 13:30:00.023',
                            '20160525 13:30:00.030',
                            '20160525 13:30:00.041',
                            '20160525 13:30:00.048',
                            '20160525 13:30:00.049',
                            '20160525 13:30:00.072',
                            '20160525 13:30:00.075']),
    'ticker': ['GOOG', 'MSFT', 'MSFT','MSFT', 'GOOG', 'AAPL', 'GOOG','MSFT'],
    'bid': [720.50, 51.95, 51.97, 51.99,720.50, 97.99, 720.50, 52.01],
    'ask': [720.93, 51.96, 51.98, 52.00,720.93, 98.01, 720.88, 52.03]},
    columns=['time', 'ticker', 'bid', 'ask'])
trades
 timetickerpricequantity
02016-05-25 13:30:00.023MSFT51.9575
12016-05-25 13:30:00.038MSFT51.95155
22016-05-25 13:30:00.048GOOG720.77100
32016-05-25 13:30:00.048GOOG720.92100
42016-05-25 13:30:00.048AAPL98.00100
quotes
 timetickerbidask
02016-05-25 13:30:00.023GOOG720.50720.93
12016-05-25 13:30:00.023MSFT51.9551.96
22016-05-25 13:30:00.030MSFT51.9751.98
32016-05-25 13:30:00.041MSFT51.9952.00
42016-05-25 13:30:00.048GOOG720.50720.93
52016-05-25 13:30:00.049AAPL97.9998.01
62016-05-25 13:30:00.072GOOG720.50720.88
72016-05-25 13:30:00.075MSFT52.0152.03
df_merge_asof = pd.merge_asof(trades, quotes,
              on='time',
              by='ticker')

df_merge_asof
 timetickerpricequantitybidask
02016-05-25 13:30:00.023MSFT51.957551.9551.96
12016-05-25 13:30:00.038MSFT51.9515551.9751.98
22016-05-25 13:30:00.048GOOG720.77100720.50720.93
32016-05-25 13:30:00.048GOOG720.92100720.50720.93
42016-05-25 13:30:00.048AAPL98.00100NaNNaN

अगर आप ध्यान से देखें, तो AAPL टिकर वाली पंक्ति में NaN आने का कारण समझ आएगा। क्योंकि राइट DataFrame quotes में AAPL टिकर के लिए लेफ्ट टेबल के समय 13:30:00.048 से कम कोई time मान नहीं था, इसलिए bid और ask कॉलम में NaN आ गए।

आप time कॉलम के लिए एक पूर्वनिर्धारित टॉलरेंस स्तर भी सेट कर सकते हैं। मान लीजिए कि आप केवल quote time और trade time के बीच 2ms के भीतर asof मर्ज करना चाहते हैं, तो आपको tolerance आर्ग्युमेंट देना होगा:

df_merge_asof_tolerance = pd.merge_asof(trades, quotes,
              on='time',
              by='ticker',
              tolerance=pd.Timedelta('2ms'))

df_merge_asof_tolerance
 timetickerpricequantitybidask
02016-05-25 13:30:00.023MSFT51.957551.9551.96
12016-05-25 13:30:00.038MSFT51.95155NaNNaN
22016-05-25 13:30:00.048GOOG720.77100720.50720.93
32016-05-25 13:30:00.048GOOG720.92100720.50720.93
42016-05-25 13:30:00.048AAPL98.00100NaNNaN

ऊपर और पिछले परिणाम के बीच फर्क नोट करें। अगर समय की टॉलरेंस 2ms के भीतर नहीं है तो पंक्तियाँ मर्ज नहीं होतीं।

निष्कर्ष

इस ट्यूटोरियल में, आपने pandas लाइब्रेरी के concat() और merge() फ़ंक्शंस का उपयोग करके विभिन्न लॉजिक के आधार पर DataFrames को कंकैटिनेट और मर्ज करना सीखा। अंत में, आपने टाइम-सीरीज़ DataFrames को मर्ज करने के लिए विशेष फ़ंक्शन merge_asof() का अभ्यास किया। रास्ते में, आपने DataFrame इंडेक्सेस के साथ काम करना भी सीखा। pandas में DataFrames को जॉइन करने के लिए कई अन्य विकल्प हैं; मैं आपको इसकी बेहतरीन डॉक्यूमेंटेशन देखने के लिए प्रोत्साहित करता हूँ। शुभकामनाएँ!

इस ट्यूटोरियल को लिखने में सहायता के लिए यह pandas डॉक्यूमेंटेशन इस्तेमाल किया गया।

अगर आप pandas के बारे में और सीखना चाहते हैं, तो DataCamp का Data Manipulation with pandas कोर्स लें और हमारा Python Pandas में DataFrames ट्यूटोरियल देखें।

DataCamp के पास कई और उपयोगी pandas ट्यूटोरियल भी हैं, जिनमें शामिल हैं:

हैप्पी लर्निंग!

FAQs

pandas में merge() और join() में क्या अंतर है?

merge() अधिक लचीला है और किसी भी कॉलम(स्) पर DataFrames को जॉइन कर सकता है, ठीक SQL जोइन्स की तरह। join() मुख्य रूप से इंडेक्स पर जॉइन करने के लिए डिज़ाइन किया गया है और अंदर से merge() को ही कॉल करता है। जब कॉलम्स पर जॉइन करना हो तो merge() उपयोग करें, और जब आपकी जॉइन कीज़ पहले से इंडेक्स में सेट हों तो join()।

मैं pandas में कई कॉलम्स पर DataFrames को कैसे मर्ज करूँ?

on पैरामीटर में कॉलम नामों की सूची पास करें: pd.merge(df1, df2, on=['col1', 'col2'])। अगर कॉलम नाम DataFrames के बीच अलग हैं, तो सूचियों के साथ left_on और right_on का उपयोग करें: pd.merge(df1, df2, left_on=['a', 'b'], right_on=['c', 'd'])।

DataFrames को मर्ज करते समय मिसिंग वैल्यूज़ का क्या होता है?

व्यवहार जॉइन टाइप पर निर्भर करता है। inner जॉइन में, बिना मिलान वाली पंक्तियाँ हटा दी जाती हैं। left, right, या outer जोइन्स में, बिना मिलान वाली पंक्तियाँ बनी रहती हैं और दूसरे DataFrame के कॉलम्स में NaN से भरी जाती हैं। मर्ज के बाद आप fillna() या dropna() से इन्हें संभाल सकते हैं।

मुझे pandas में concat() कब उपयोग करना चाहिए और merge() कब?

concat() का उपयोग DataFrames को वर्टिकली (पंक्तियाँ जोड़ना) या हॉरिजोंटली (कॉलम जोड़ना) स्टैक करने के लिए करें, जो इंडेक्स अलाइनमेंट पर आधारित होता है। जब आपको कॉमन कॉलम मानों के आधार पर DataFrames को जोड़ना हो—SQL जोइन्स की तरह—तो merge() का उपयोग करें। concat() को DataFrames को "ग्लू" करने जैसा समझें, जबकि merge() रिलेशनल जोइन्स के लिए है।

pandas मर्ज के बाद डुप्लिकेट कॉलम नामों को कैसे संभालें?

डिफ़ॉल्ट रूप से, pandas डुप्लिकेट कॉलम नामों पर _x और _y सफिक्स जोड़ता है। इसे suffixes पैरामीटर से कस्टमाइज़ करें: pd.merge(df1, df2, on='id', suffixes=('_left', '_right'))। मर्ज के बाद, आप df.rename(columns={'old': 'new'}) से कॉलम का नाम बदल सकते हैं या df.drop(columns=['col_y']) से डुप्लिकेट कॉलम हटा सकते हैं।

pandas में merge() और join() में क्या अंतर है?

merge() अधिक लचीला है और किसी भी कॉलम(स्) पर DataFrames को जॉइन कर सकता है, ठीक SQL जोइन्स की तरह। join() मुख्य रूप से इंडेक्स पर जॉइन करने के लिए डिज़ाइन किया गया है और अंदर से merge() को ही कॉल करता है। जब कॉलम्स पर जॉइन करना हो तो merge() उपयोग करें, और जब आपकी जॉइन कीज़ पहले से इंडेक्स में सेट हों तो join()।

मैं pandas में कई कॉलम्स पर DataFrames को कैसे मर्ज करूँ?

on पैरामीटर में कॉलम नामों की सूची पास करें: pd.merge(df1, df2, on=['col1', 'col2'])। अगर कॉलम नाम DataFrames के बीच अलग हैं, तो सूचियों के साथ left_on और right_on का उपयोग करें: pd.merge(df1, df2, left_on=['a', 'b'], right_on=['c', 'd'])।

DataFrames को मर्ज करते समय मिसिंग वैल्यूज़ का क्या होता है?

व्यवहार जॉइन टाइप पर निर्भर करता है। inner जॉइन में, बिना मिलान वाली पंक्तियाँ हटा दी जाती हैं। left, right, या outer जोइन्स में, बिना मिलान वाली पंक्तियाँ बनी रहती हैं और दूसरे DataFrame के कॉलम्स में NaN से भरी जाती हैं। मर्ज के बाद आप fillna() या dropna() से इन्हें संभाल सकते हैं।

मुझे pandas में concat() कब उपयोग करना चाहिए और merge() कब?

concat() का उपयोग DataFrames को वर्टिकली (पंक्तियाँ जोड़ना) या हॉरिजोंटली (कॉलम जोड़ना) स्टैक करने के लिए करें, जो इंडेक्स अलाइनमेंट पर आधारित होता है। जब आपको कॉमन कॉलम मानों के आधार पर DataFrames को जोड़ना हो—SQL जोइन्स की तरह—तो merge() का उपयोग करें। concat() को DataFrames को "ग्लू" करने जैसा समझें, जबकि merge() रिलेशनल जोइन्स के लिए है।

pandas मर्ज के बाद डुप्लिकेट कॉलम नामों को कैसे संभालें?

डिफ़ॉल्ट रूप से, pandas डुप्लिकेट कॉलम नामों पर _x और _y सफिक्स जोड़ता है। इसे suffixes पैरामीटर से कस्टमाइज़ करें: pd.merge(df1, df2, on='id', suffixes=('_left', '_right'))। मर्ज के बाद, आप df.rename(columns={'old': 'new'}) से कॉलम का नाम बदल सकते हैं या df.drop(columns=['col_y']) से डुप्लिकेट कॉलम हटा सकते हैं।

विषय