इस ट्यूटोरियल का कोड ऑनलाइन चलाएं और संपादित करें
कोड चलाएं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
| id | Feature1 | Feature2 | |
|---|---|---|---|
| 0 | 1 | A | B |
| 1 | 2 | C | D |
| 2 | 3 | E | F |
| 3 | 4 | G | H |
| 4 | 5 | I | J |
जैसा कि आप देख सकते हैं, अब आपके पास तीन कॉलम—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
| id | Feature1 | Feature2 | |
|---|---|---|---|
| 0 | 1 | K | L |
| 1 | 2 | M | N |
| 2 | 6 | O | P |
| 3 | 7 | Q | R |
| 4 | 8 | S | T |
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
| id | Feature3 | |
|---|---|---|
| 0 | 1 | 12 |
| 1 | 2 | 13 |
| 2 | 3 | 14 |
| 3 | 4 | 15 |
| 4 | 5 | 16 |
| 5 | 7 | 17 |
| 6 | 8 | 15 |
| 7 | 9 | 12 |
| 8 | 10 | 13 |
| 9 | 11 | 23 |
concat()
सिर्फ DataFrames को पंक्तियों के साथ जोड़ने के लिए आप pandas में concat() फ़ंक्शन का उपयोग कर सकते हैं। आपको concat() फ़ंक्शन को आर्ग्युमेंट के रूप में DataFrames के नामों की सूची पास करनी होगी:
df_row = pd.concat([df1, df2])
df_row
| id | Feature1 | Feature2 | |
|---|---|---|---|
| 0 | 1 | A | B |
| 1 | 2 | C | D |
| 2 | 3 | E | F |
| 3 | 4 | G | H |
| 4 | 5 | I | J |
| 0 | 1 | K | L |
| 1 | 2 | M | N |
| 2 | 6 | O | P |
| 3 | 7 | Q | R |
| 4 | 8 | S | T |
आप देख सकते हैं कि अब df1 और df2 दोनों DataFrames पंक्तियों के साथ जोड़कर एक ही DataFrame df_row बन गए हैं। हालांकि, पंक्ति लेबल गलत लग रहे हैं। अगर आप चाहते हैं कि जॉइन के अनुसार पंक्ति लेबल अपने-आप समायोजित हो जाएँ, तो concat() फ़ंक्शन कॉल करते समय ignore_index आर्ग्युमेंट को True सेट करें:
df_row_reindex = pd.concat([df1, df2], ignore_index=True)
df_row_reindex
| id | Feature1 | Feature2 | |
|---|---|---|---|
| 0 | 1 | A | B |
| 1 | 2 | C | D |
| 2 | 3 | E | F |
| 3 | 4 | G | H |
| 4 | 5 | I | J |
| 5 | 1 | K | L |
| 6 | 2 | M | N |
| 7 | 6 | O | P |
| 8 | 7 | Q | R |
| 9 | 8 | S | T |
अब पंक्ति लेबल सही हैं!
pandas आपको एक और विकल्प देता है कि कंकैटिनेशन के बाद DataFrames को किसी कुंजी से लेबल कर दें, ताकि आपको पता रहे कि कौन-सा डेटा किस DataFrame से आया है। इसके लिए आप अतिरिक्त आर्ग्युमेंट keys पास कर सकते हैं, जिसमें DataFrames के लेबल नामों की सूची होती है। यहाँ आप वही कंकैटिनेशन करेंगे, लेकिन df1 और df2 के लिए क्रमशः x और y कीज़ के साथ।
frames = [df1,df2]
df_keys = pd.concat(frames, keys=['x', 'y'])
df_keys
| id | Feature1 | Feature2 | ||
|---|---|---|---|---|
| x | 0 | 1 | A | B |
| 1 | 2 | C | D | |
| 2 | 3 | E | F | |
| 3 | 4 | G | H | |
| 4 | 5 | I | J | |
| y | 0 | 1 | K | L |
| 1 | 2 | M | N | |
| 2 | 6 | O | P | |
| 3 | 7 | Q | R | |
| 4 | 8 | S | T |
कीज़ बताने से किसी विशेष DataFrame के अनुरूप डेटा निकालना भी आसान हो जाता है। आप loc मेथड का उपयोग करके उस DataFrame df2 का डेटा निकाल सकते हैं जिसका लेबल y था:
df_keys.loc['y']
| id | Feature1 | Feature2 | |
|---|---|---|---|
| 0 | 1 | K | L |
| 1 | 2 | M | N |
| 2 | 6 | O | P |
| 3 | 7 | Q | R |
| 4 | 8 | S | T |
आप concat() को डिक्शनरी भी पास कर सकते हैं; ऐसे में (जब तक अन्य keys निर्दिष्ट न हों) डिक्शनरी कीज़ ही keys आर्ग्युमेंट के रूप में उपयोग होंगी:
pieces = {'x': df1, 'y': df2}
df_piece = pd.concat(pieces)
df_piece
| id | Feature1 | Feature2 | ||
|---|---|---|---|---|
| x | 0 | 1 | A | B |
| 1 | 2 | C | D | |
| 2 | 3 | E | F | |
| 3 | 4 | G | H | |
| 4 | 5 | I | J | |
| y | 0 | 1 | K | L |
| 1 | 2 | M | N | |
| 2 | 6 | O | P | |
| 3 | 7 | Q | R | |
| 4 | 8 | S | T |
ध्यान देने योग्य है कि 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
| id | Feature1 | Feature2 | id | Feature1 | Feature2 | |
|---|---|---|---|---|---|---|
| 0 | 1 | A | B | 1 | K | L |
| 1 | 2 | C | D | 2 | M | N |
| 2 | 3 | E | F | 6 | O | P |
| 3 | 4 | G | H | 7 | Q | R |
| 4 | 5 | I | J | 8 | S | T |
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
| id | Feature1 | Feature2 | Feature3 | |
|---|---|---|---|---|
| 0 | 1 | A | B | 12 |
| 1 | 1 | K | L | 12 |
| 2 | 2 | C | D | 13 |
| 3 | 2 | M | N | 13 |
| 4 | 3 | E | F | 14 |
| 5 | 4 | G | H | 15 |
| 6 | 5 | I | J | 16 |
| 7 | 7 | Q | R | 17 |
| 8 | 8 | S | T | 15 |
आप देख सकते हैं कि अब 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
| id | Feature1 | Feature2 | Feature3 | |
|---|---|---|---|---|
| 0 | 1 | A | B | 12 |
| 1 | 1 | K | L | 12 |
| 2 | 2 | C | D | 13 |
| 3 | 2 | M | N | 13 |
| 4 | 3 | E | F | 14 |
| 5 | 4 | G | H | 15 |
| 6 | 5 | I | J | 16 |
| 7 | 7 | Q | R | 17 |
| 8 | 8 | S | T | 15 |
आप 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
| id | Feature1 | Feature2 | Feature3 | |
|---|---|---|---|---|
| 0 | 1 | A | B | 12 |
| 1 | 1 | K | L | 12 |
| 2 | 2 | C | D | 13 |
| 3 | 2 | M | N | 13 |
| 4 | 3 | E | F | 14 |
| 5 | 4 | G | H | 15 |
| 6 | 5 | I | J | 16 |
| 7 | 7 | Q | R | 17 |
| 8 | 8 | S | T | 15 |
| 9 | 10 | X1 | X2 | X3 |
pandas जॉइन के प्रकार
इस सेक्शन में, आप किसी कॉमन कॉलम/की के आधार पर pandas DataFrames को मर्ज करने के लिए उपलब्ध विभिन्न जॉइन लॉजिक का अभ्यास करेंगे। इन जोइन्स के पीछे की लॉजिक वही है जो SQL में टेबल्स को जॉइन करते समय होती है। अगर आप SQL में inner बनाम outer जोइन्स से परिचित हैं, तो ये कॉन्सेप्ट्स आपको जान-पहचान के लगेंगे।
| Join Type | SQL Equivalent | Result | Use Case |
|---|---|---|---|
inner | INNER JOIN | सिर्फ दोनों DataFrames के मिलते-जुलते रो | जब आप सिर्फ वे रिकॉर्ड चाहते हैं जो दोनों टेबल्स में मौजूद हों |
left | LEFT OUTER JOIN | लेफ्ट की सभी पंक्तियाँ + राइट की मिलान वाली | प्राइमरी DataFrame के सभी रिकॉर्ड रखना |
right | RIGHT OUTER JOIN | राइट की सभी पंक्तियाँ + लेफ्ट की मिलान वाली | सेकेंडरी DataFrame के सभी रिकॉर्ड रखना |
outer | FULL OUTER JOIN | दोनों DataFrames की सभी पंक्तियाँ | जब आपको दोनों टेबल्स का पूर्ण यूनियन चाहिए |
फुल आउटर जॉइन
FULL OUTER JOIN लेफ्ट और राइट आउटर जॉइन दोनों के नतीजों को मिलाता है। जॉइन किया गया DataFrame दोनों DataFrames के सभी रिकॉर्ड्स रखेगा और किसी भी तरफ मिलान न होने पर NaN मान भर देगा। आप merge() फ़ंक्शन में how आर्ग्युमेंट को outer सेट करके फुल आउटर जॉइन कर सकते हैं:
df_outer = pd.merge(df1, df2, on='id', how='outer')
df_outer
| id | Feature1_x | Feature2_x | Feature1_y | Feature2_y | |
|---|---|---|---|---|---|
| 0 | 1 | A | B | K | L |
| 1 | 2 | C | D | M | N |
| 2 | 3 | E | F | NaN | NaN |
| 3 | 4 | G | H | NaN | NaN |
| 4 | 5 | I | J | NaN | NaN |
| 5 | 6 | NaN | NaN | O | P |
| 6 | 7 | NaN | NaN | Q | R |
| 7 | 8 | NaN | NaN | S | T |
आप देख सकते हैं कि परिणामस्वरूप 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
| id | Feature1_left | Feature2_left | Feature1_right | Feature2_right | |
|---|---|---|---|---|---|
| 0 | 1 | A | B | K | L |
| 1 | 2 | C | D | M | N |
| 2 | 3 | E | F | NaN | NaN |
| 3 | 4 | G | H | NaN | NaN |
| 4 | 5 | I | J | NaN | NaN |
| 5 | 6 | NaN | NaN | O | P |
| 6 | 7 | NaN | NaN | Q | R |
| 7 | 8 | NaN | NaN | S | T |
इनर जॉइन
INNER JOIN केवल वही रिकॉर्ड देता है जो DataFrame A और DataFrame B दोनों में मिलते हैं। इनर जॉइन करने के लिए merge() फ़ंक्शन के how आर्ग्युमेंट में inner पास करें:
df_inner = pd.merge(df1, df2, on='id', how='inner')
df_inner
| id | Feature1_x | Feature2_x | Feature1_y | Feature2_y | |
|---|---|---|---|---|---|
| 0 | 1 | A | B | K | L |
| 1 | 2 | C | D | M | N |
राइट जॉइन
RIGHT JOIN DataFrame B (राइट DataFrame) के सभी रिकॉर्ड देता है, और जहाँ मिलान उपलब्ध है वहाँ DataFrame A (लेफ्ट DataFrame) के मिलते-जुलते रिकॉर्ड्स दिखाता है। अगर मिलान नहीं है, तो राइट साइड पर null होगा। राइट जॉइन करने के लिए merge() के how आर्ग्युमेंट में right पास करें:
df_right = pd.merge(df1, df2, on='id', how='right')
df_right
| id | Feature1_x | Feature2_x | Feature1_y | Feature2_y | |
|---|---|---|---|---|---|
| 0 | 1 | A | B | K | L |
| 1 | 2 | C | D | M | N |
| 2 | 6 | NaN | NaN | O | P |
| 3 | 7 | NaN | NaN | Q | R |
| 4 | 8 | NaN | NaN | S | T |
लेफ्ट जॉइन
LEFT JOIN DataFrame A (लेफ्ट DataFrame) के सभी रिकॉर्ड देता है, और जहाँ मिलान उपलब्ध है वहाँ DataFrame B (राइट DataFrame) के मिलते-जुलते रिकॉर्ड्स दिखाता है। अगर मिलान नहीं है, तो लेफ्ट साइड पर null होगा। लेफ्ट जॉइन करने के लिए merge() के how आर्ग्युमेंट में left पास करें:
df_left = pd.merge(df1, df2, on='id', how='left')
df_left
| id | Feature1_x | Feature2_x | Feature1_y | Feature2_y | |
|---|---|---|---|---|---|
| 0 | 1 | A | B | K | L |
| 1 | 2 | C | D | M | N |
| 2 | 3 | E | F | NaN | NaN |
| 3 | 4 | G | H | NaN | NaN |
| 4 | 5 | I | J | NaN | NaN |
इंडेक्स पर जॉइनिंग
कभी-कभी आपको इंडेक्सेस या पंक्ति लेबल्स पर जॉइन करना पड़ सकता है। ऐसा करने के लिए, आपको right_index (राइट DataFrame के इंडेक्सेस के लिए) और left_index (लेफ्ट DataFrame के इंडेक्सेस के लिए) को True सेट करना होगा:
df_index = pd.merge(df1, df2, right_index=True, left_index=True)
df_index
| id_x | Feature1_x | Feature2_x | id_y | Feature1_y | Feature2_y | |
|---|---|---|---|---|---|---|
| 0 | 1 | A | B | 1 | K | L |
| 1 | 2 | C | D | 2 | M | N |
| 2 | 3 | E | F | 6 | O | P |
| 3 | 4 | G | H | 7 | Q | R |
| 4 | 5 | I | J | 8 | S | T |
pandas Join
pandas का DataFrame.join() मेथड यूनिक इंडेक्सेस पर DataFrames को जॉइन करने के लिए उपयोग होता है। आप वैकल्पिक आर्ग्युमेंट `on` का उपयोग करके कॉलम नामों को इंडेक्स पर जॉइन कर सकते हैं और how आर्ग्युमेंट से दो ऑब्जेक्ट्स के बीच ऑपरेशन नियंत्रित कर सकते हैं। डिफ़ॉल्ट रूप से, यह इनर जॉइन का उपयोग करेगा।
pandas में दो DataFrames जॉइन करना
आइए .join का उपयोग करके दो डेटा फ्रेम्स को जॉइन करें। हमने कॉलम ओवरलैपिंग एरर से बचने के लिए `lsuffix` और `rsuffix` प्रदान किए हैं। यह कॉलम पर नहीं बल्कि इंडेक्स पर जॉइन करता है, इसलिए हमें या तो ‘id’ कॉलम बदलना होगा या सफिक्स देना होगा।
df2.join(df3, lsuffix='_left', rsuffix='_right')
| id_left | Feature1 | Feature2 | id_right | Feature3 | |
|---|---|---|---|---|---|
| 0 | 1 | K | L | 1 | 12 |
| 1 | 2 | M | N | 2 | 13 |
| 2 | 6 | O | P | 3 | 14 |
| 3 | 7 | Q | R | 4 | 15 |
| 4 | 8 | S | T | 5 | 16 |
हम `on` आर्ग्युमेंट का उपयोग करके कॉलम्स को इंडेक्स पर भी जॉइन कर सकते हैं। जॉइन सफलतापूर्वक लागू करने के लिए, हमें df3 के ‘id’ कॉलम को इंडेक्स में सेट करना होगा और `on` आर्ग्युमेंट में ‘id’ कॉलम देना होगा। डिफ़ॉल्ट रूप से, यह लेफ्ट जॉइन का उपयोग करेगा।
df2.join(df3.set_index('id'), on='id')
| id | Feature1 | Feature2 | Feature3 | |
|---|---|---|---|---|
| 0 | 1 | K | L | 12.0 |
| 1 | 2 | M | N | 13.0 |
| 2 | 6 | O | P | NaN |
| 3 | 7 | Q | R | 17.0 |
| 4 | 8 | S | T | 15.0 |
बिल्कुल merge फ़ंक्शन की तरह, हम `how` आर्ग्युमेंट देकर join का ऑपरेशन बदल सकते हैं। हमारे मामले में, हम इनर जॉइन का उपयोग करेंगे।
df2.join(df3.set_index('id'), on='id', how = "inner")
| id_left | Feature1 | Feature2 | Feature3 | |
|---|---|---|---|---|
| 0 | 1 | K | L | 12 |
| 1 | 2 | M | N | 13 |
| 3 | 7 | Q | R | 17 |
| 4 | 8 | S | T | 15 |
टाइम-सीरीज़ फ्रेंडली मर्जिंग
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
| time | ticker | price | quantity | |
|---|---|---|---|---|
| 0 | 2016-05-25 13:30:00.023 | MSFT | 51.95 | 75 |
| 1 | 2016-05-25 13:30:00.038 | MSFT | 51.95 | 155 |
| 2 | 2016-05-25 13:30:00.048 | GOOG | 720.77 | 100 |
| 3 | 2016-05-25 13:30:00.048 | GOOG | 720.92 | 100 |
| 4 | 2016-05-25 13:30:00.048 | AAPL | 98.00 | 100 |
quotes
| time | ticker | bid | ask | |
|---|---|---|---|---|
| 0 | 2016-05-25 13:30:00.023 | GOOG | 720.50 | 720.93 |
| 1 | 2016-05-25 13:30:00.023 | MSFT | 51.95 | 51.96 |
| 2 | 2016-05-25 13:30:00.030 | MSFT | 51.97 | 51.98 |
| 3 | 2016-05-25 13:30:00.041 | MSFT | 51.99 | 52.00 |
| 4 | 2016-05-25 13:30:00.048 | GOOG | 720.50 | 720.93 |
| 5 | 2016-05-25 13:30:00.049 | AAPL | 97.99 | 98.01 |
| 6 | 2016-05-25 13:30:00.072 | GOOG | 720.50 | 720.88 |
| 7 | 2016-05-25 13:30:00.075 | MSFT | 52.01 | 52.03 |
df_merge_asof = pd.merge_asof(trades, quotes,
on='time',
by='ticker')
df_merge_asof
| time | ticker | price | quantity | bid | ask | |
|---|---|---|---|---|---|---|
| 0 | 2016-05-25 13:30:00.023 | MSFT | 51.95 | 75 | 51.95 | 51.96 |
| 1 | 2016-05-25 13:30:00.038 | MSFT | 51.95 | 155 | 51.97 | 51.98 |
| 2 | 2016-05-25 13:30:00.048 | GOOG | 720.77 | 100 | 720.50 | 720.93 |
| 3 | 2016-05-25 13:30:00.048 | GOOG | 720.92 | 100 | 720.50 | 720.93 |
| 4 | 2016-05-25 13:30:00.048 | AAPL | 98.00 | 100 | NaN | NaN |
अगर आप ध्यान से देखें, तो 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
| time | ticker | price | quantity | bid | ask | |
|---|---|---|---|---|---|---|
| 0 | 2016-05-25 13:30:00.023 | MSFT | 51.95 | 75 | 51.95 | 51.96 |
| 1 | 2016-05-25 13:30:00.038 | MSFT | 51.95 | 155 | NaN | NaN |
| 2 | 2016-05-25 13:30:00.048 | GOOG | 720.77 | 100 | 720.50 | 720.93 |
| 3 | 2016-05-25 13:30:00.048 | GOOG | 720.92 | 100 | 720.50 | 720.93 |
| 4 | 2016-05-25 13:30:00.048 | AAPL | 98.00 | 100 | NaN | NaN |
ऊपर और पिछले परिणाम के बीच फर्क नोट करें। अगर समय की टॉलरेंस 2ms के भीतर नहीं है तो पंक्तियाँ मर्ज नहीं होतीं।
निष्कर्ष
इस ट्यूटोरियल में, आपने pandas लाइब्रेरी के concat() और merge() फ़ंक्शंस का उपयोग करके विभिन्न लॉजिक के आधार पर DataFrames को कंकैटिनेट और मर्ज करना सीखा। अंत में, आपने टाइम-सीरीज़ DataFrames को मर्ज करने के लिए विशेष फ़ंक्शन merge_asof() का अभ्यास किया। रास्ते में, आपने DataFrame इंडेक्सेस के साथ काम करना भी सीखा। pandas में DataFrames को जॉइन करने के लिए कई अन्य विकल्प हैं; मैं आपको इसकी बेहतरीन डॉक्यूमेंटेशन देखने के लिए प्रोत्साहित करता हूँ। शुभकामनाएँ!
इस ट्यूटोरियल को लिखने में सहायता के लिए यह pandas डॉक्यूमेंटेशन इस्तेमाल किया गया।
अगर आप pandas के बारे में और सीखना चाहते हैं, तो DataCamp का Data Manipulation with pandas कोर्स लें और हमारा Python Pandas में DataFrames ट्यूटोरियल देखें।
DataCamp के पास कई और उपयोगी pandas ट्यूटोरियल भी हैं, जिनमें शामिल हैं:
- CSV डेटा को pandas में इंपोर्ट करना
- pandas में कॉलम जोड़ना
- pandas में मानों को सॉर्ट करना
- pandas में डुप्लिकेट्स हटाना
drop_duplicatesके साथ - pandas groupby के साथ डेटा को ग्रुप करना
- pandas में DataFrame इंडेक्सेस रीसेट करना
हैप्पी लर्निंग!
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']) से डुप्लिकेट कॉलम हटा सकते हैं।
क्या आपने कभी Kaggle चैलेंज हल करने की कोशिश की है? अगर हां, तो आपने देखा होगा कि ज्यादातर चैलेंजों में आपको जो डेटा मिलता है वह कई फाइलों में बंटा होता है, और कुछ कॉलम एक से अधिक फाइलों में मौजूद होते हैं। तब आपके दिमाग में सबसे पहली बात क्या आती है? जाहिर है—उन्हें जोड़ना!
इस ट्यूटोरियल में, आप कुछ मानक 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 को आसानी से जोड़ने के लिए कई सुविधाएँ प्रदान करता है।