{count, plural, one {कोर्स} other {कोर्स}}
Pandas सीखते समय हम सभी जिन उलझनों से जूझते हैं, उनमें से एक है .loc और .iloc के बीच का अंतर।
आइए इस भ्रम को खत्म करें और इन दोनों विधियों के बीच का फर्क साफ करें। मैं पर्याप्त उदाहरण दूंगा, और उम्मीद है कि ब्लॉग के अंत तक यह अंतर काफी स्पष्ट हो जाएगा।
Pandas में .loc और .iloc क्या हैं?
.loc और .iloc दोनों ही Pandas DataFrames की आवश्यक विशेषताएँ हैं, और दोनों का उपयोग डेटा के विशिष्ट उपसमूह चुनने के लिए किया जाता है। इनका उद्देश्य पूरे DataFrame के बजाय उसके किसी खास हिस्से तक पहुँचना और उसे संशोधित करने में सक्षम बनाना है।
|
विशेषता |
.loc |
.iloc |
|
वाक्य-विन्यास (Syntax) |
df.loc[row_indexer, column_indexer] |
df.iloc[row_indexer, column_indexer] |
|
इंडेक्सिंग विधि |
लेबल-आधारित इंडेक्सिंग |
स्थिति-आधारित इंडेक्सिंग |
|
किस संदर्भ में उपयोग |
पंक्ति और स्तंभ के लेबल (नाम) |
पंक्तियों और स्तंभों के संख्यात्मक सूचकांक (0 से शुरू) |
जैसा कि हम तालिका से देख सकते हैं, वाक्य-विन्यास बहुत मिलता-जुलता दिखता है। फर्क इस बात में है कि हम row_indexer और column_indexer आर्ग्युमेंट्स का उपयोग कैसे करते हैं। ऐसा इसलिए है क्योंकि ये दोनों विधियाँ इंडेक्सिंग के अलग-अलग तरीके देती हैं: जहाँ .loc लेबल नामों के आधार पर इंडेक्स करता है, वहीं .iloc पंक्तियों और स्तंभों की संख्यात्मक स्थिति सूचकांकों को आर्ग्युमेंट के रूप में लेता है।
आइए .loc से शुरू करते हुए इन दोनों विधियों को विस्तार से समझें।
.loc का उपयोग: लेबल द्वारा चयन
धारणा समझाने के लिए, एक काल्पनिक ग्राहक डेटाबेस पर विचार करें जो इस DataFrame df द्वारा दर्शाया गया है, जिसमें Customer ID पंक्ति index का प्रतिनिधित्व करता है:
|
Customer ID |
Name |
Country |
Region |
Age |
|
C123 |
John Doe |
United States |
North America |
67 |
|
C234 |
Petra Müller |
Germany |
Europe |
51 |
|
C345 |
Ali Khan |
Pakistan |
Asia |
19 |
|
C456 |
Maria Gonzalez |
Mexico |
North America |
26 |
|
C567 |
David Lee |
China |
Asia |
40 |
यहाँ .loc के साथ पंक्तियाँ चुनने के चार प्रमुख तरीके हैं। इनमें शामिल हैं:
- एकल पंक्ति का चयन
- एकाधिक पंक्तियों का चयन
- पंक्तियों का स्लाइस चुनना
- शर्त-आधारित पंक्ति चयन
.loc का उपयोग करके एकल पंक्ति चुनना
एकल पंक्ति चुनने के लिए, हम उस पंक्ति के लेबल को row_indexer के रूप में उपयोग करते हैं जिसे हमें प्राप्त करना है। तदनुसार, वाक्य-विन्यास इस तरह दिखता है: df.loc['row_label']। आइए इसका उपयोग करके हमारे ग्राहक Ali Khan की सारी जानकारी दिखाएँ:
df.loc['C345']
|
C345 |
|
|
Name |
Ali Khan |
|
Country |
Pakistan |
|
Region |
Asia |
|
Age |
19 |
.loc का उपयोग करके एकाधिक पंक्तियाँ चुनना
यदि हम ऐसी कई पंक्तियाँ चुनना चाहते हैं जो क्रम में एक-दूसरे के बाद न आती हों, तो हमें उनके पंक्ति लेबल्स की सूची को row_indexer आर्ग्युमेंट के रूप में पास करना होगा। इसका मतलब है कि हमें दो जोड़ी वर्ग कोष्ठकों का उपयोग करना होगा: एक सामान्य .loc वाक्य-विन्यास के लिए और एक लेबल सूची के लिए।
पंक्ति df.loc[['row_label_1', 'row_label_2']] सूची में निर्दिष्ट df DataFrame की दोनों पंक्तियाँ लौटाएगी। मान लें कि हम Ali Khan के साथ-साथ David Lee की जानकारी भी जानना चाहते हैं:
df.loc[['C345', 'C567']]
|
Customer ID |
Name |
Country |
Region |
Age |
|
C345 |
Ali Khan |
Pakistan |
Asia |
19 |
|
C567 |
David Lee |
China |
Asia |
40 |
.loc का उपयोग करके पंक्तियों का स्लाइस चुनना
हम दो पंक्ति लेबल्स के बीच कॉलन लगाकर पंक्तियों की एक रेंज चुन सकते हैं: df.loc['row_label_start':'row_label_end']। हम अपने DataFrame की पहली चार पंक्तियाँ इस तरह दिखा सकते हैं:
df.loc['C123' : 'C456']
|
Customer ID |
Name |
Country |
Region |
Signup Date |
|
C123 |
John Doe |
United States |
North America |
67 |
|
C234 |
Petra Müller |
Germany |
Europe |
51 |
|
C345 |
Ali Khan |
Pakistan |
Asia |
19 |
|
C456 |
Maria Gonzalez |
Mexico |
North America |
26 |
यहाँ दो बातों का ध्यान रखें:
- आउटपुट में
row_label_endमें निर्दिष्ट पंक्ति भी शामिल होती है। यह.ilocसे अलग है, जिसके बारे में हम आगे बात करेंगे। - भले ही हम कई पंक्तियाँ प्राप्त करना चाहते हैं, हम केवल एक जोड़ी वर्ग कोष्ठक का उपयोग करते हैं। हम विभिन्न पंक्तियाँ निर्दिष्ट करने के लिए सूची का उपयोग नहीं करते, इसलिए दो वर्ग कोष्ठक उपयोग करने पर
SyntaxErrorमिलेगा।
.loc का उपयोग करके शर्त-आधारित पंक्ति चयन
हम शर्तात्मक अभिव्यक्ति के आधार पर पंक्तियाँ भी लौटा सकते हैं। हम किसी शर्त को पूरा करने-न करने के आधार पर सभी पंक्तियों को फ़िल्टर कर सकते हैं और केवल वही दिखा सकते हैं जो शर्त पूरी करती हैं।
इसका वाक्य-विन्यास है df.loc[conditional_expression], जहाँ conditional_expression किसी विशेष स्तंभ में स्वीकृत मानों पर आधारित कथन होता है।
गैर-संख्यात्मक डेटा वाले स्तंभों (जैसे Name या Country) में, कथन केवल समता या असमता ऑपरेटर का उपयोग कर सकता है, क्योंकि मानों के बीच कोई क्रम नहीं होता। उदाहरण के लिए, हम एशिया से नहीं होने वाले सभी ग्राहकों की पंक्तियाँ लौटा सकते हैं:
df.loc[df['Region'] != 'Asia']
|
Customer ID |
Name |
Country |
Region |
Age |
|
C123 |
John Doe |
United States |
North America |
67 |
|
C234 |
Petra Müller |
Germany |
Europe |
51 |
|
C456 |
Maria Gonzalez |
Mexico |
North America |
26 |
.loc का उपयोग करके एकल स्तंभ चुनना
स्तंभ चुनने के लिए, हमें row_indexer आर्ग्युमेंट के बाद आने वाले column_indexer आर्ग्युमेंट को निर्दिष्ट करना होता है। यदि हम केवल column_indexer निर्दिष्ट करना चाहते हैं, तो हमें यह भी चिह्नित करना होगा कि हम सभी पंक्तियाँ लौटाना चाहते हैं और केवल स्तंभों पर फ़िल्टर करना चाहते हैं। आइए देखें यह कैसे किया जा सकता है!
एकल स्तंभ का चयन संबंधित स्तंभ के लेबल के साथ column_indexer निर्दिष्ट करके किया जा सकता है। सभी पंक्तियाँ प्राप्त करने के लिए, हमें row_indexer को एक साधारण कॉलन से निर्दिष्ट करना होगा। इस तरह का वाक्य-विन्यास बनता है: df.loc[:, 'column_name']।
आइए प्रत्येक ग्राहक का Name दिखाएँ:
df.loc[:, 'Name']
|
Customer ID |
Name |
|
C123 |
John Doe |
|
C234 |
Petra Müller |
|
C345 |
Ali Khan |
|
C456 |
Maria Gonzalez |
|
C567 |
David Lee |
.loc का उपयोग करके एकाधिक स्तंभ चुनना
एकाधिक स्तंभ चुनने के लिए, जो क्रम में एक-दूसरे के बाद न हों, हमें स्तंभ लेबल्स की सूची पास करनी होगी: df.loc[:, [col_label_1, 'col_label_2']]।
मान लें कि हम अपने पिछले आउटपुट में सभी ग्राहकों की Age भी जोड़ना चाहते हैं, तो यह इस तरह काम करेगा:
df.loc[:, ['Name', 'Age']]
|
Customer ID |
Name |
Age |
|
C123 |
John Doe |
67 |
|
C234 |
Petra Müller |
51 |
|
C345 |
Ali Khan |
19 |
|
C456 |
Maria Gonzalez |
26 |
|
C567 |
David Lee |
40 |
.loc का उपयोग करके स्तंभों का स्लाइस चुनना
दो स्तंभों के लेबल्स के बीच कॉलन का उपयोग करने से निर्दिष्ट स्तंभों के बीच के क्रमिक दायरे के सभी स्तंभ चुने जाते हैं। यह अंत वाले स्तंभ को भी शामिल करता है, यानी मानक वाक्य-विन्यास df.loc[:, 'col_start':'col_end'] में col_end नामक स्तंभ भी चुना जाएगा।
यदि हमें अपने ग्राहकों के Name, Country, और Region में रुचि हो, तो हमारी कोड पंक्ति कुछ यूँ होगी:
df.loc[:, 'Name':'Region']
|
Customer ID |
Name |
Country |
Region |
|
C123 |
John Doe |
United States |
North America |
|
C234 |
Petra Müller |
Germany |
Europe |
|
C345 |
Ali Khan |
Pakistan |
Asia |
|
C456 |
Maria Gonzalez |
Mexico |
North America |
|
C567 |
David Lee |
China |
Asia |
.loc के साथ संयुक्त पंक्ति और स्तंभ चयन
हम row_indexer और column_indexer दोनों को भी निर्दिष्ट कर सकते हैं। इसका उपयोग एकल जानकारी, यानी DataFrame की एक सेल, प्राप्त करने में किया जा सकता है। ऐसा करने के लिए, हम इस वाक्य-विन्यास का उपयोग करते हुए एक पंक्ति और एक स्तंभ निर्दिष्ट करते हैं: df.loc['row_label', 'column_name'] ।
अधिक उपयोगी स्थिति यह है कि हम एक ऐसा उप-DataFrame लौटाएँ जो ठीक उन्हीं पंक्तियों और स्तंभों पर केंद्रित हो जिनमें हमें रुचि है। दोनों इंडेक्सर को सूची के रूप में वर्ग कोष्ठकों के साथ, या कॉलन के साथ स्लाइस के रूप में निर्दिष्ट करना संभव है, और पंक्ति चयन के लिए इसे शर्तात्मक अभिव्यक्ति के साथ जोड़ना भी।
यह उदाहरण प्रत्येक ऐसे ग्राहक के Name, Country, और Region लौटाता है जिनकी Age 30 से अधिक है:
df.loc[df['Age'] > 30, 'Name':'Region']
|
Customer ID |
Name |
Country |
Region |
|
C123 |
John Doe |
United States |
North America |
|
C234 |
Petra Müller |
Germany |
Europe |
|
C567 |
David Lee |
China |
Asia |
.iloc का उपयोग: पूर्णांक स्थिति द्वारा चयन
.iloc लेबल के बजाय स्थिति से चयन करता है। .iloc का मानक वाक्य-विन्यास है: df.iloc[row_indexer, column_indexer]। ध्यान देने योग्य दो खास बातें हैं:
- गिनती 0 से शुरू होती है: पहली पंक्ति और स्तंभ का सूचकांक 0 होता है, दूसरी का 1, इत्यादि।
- रेंज के अंत मान की अपवर्जकता: स्लाइस का उपयोग करते समय, कॉलन के बाद निर्दिष्ट पंक्ति या स्तंभ चयन में शामिल नहीं होता।
.iloc का उपयोग करके एकल पंक्ति चुनना
एकल पंक्ति को row_indexer के रूप में पंक्ति सूचकांक संख्या दर्शाने वाले पूर्णांक का उपयोग करके चुना जा सकता है। हमें उद्धरण चिह्नों की आवश्यकता नहीं है क्योंकि हम .loc की तरह लेबल स्ट्रिंग नहीं, बल्कि पूर्णांक दर्ज कर रहे हैं। df नामक DataFrame की पहली पंक्ति लौटाने के लिए df.iloc[0] दर्ज करें।
हमारे उदाहरण DataFrame में, यही कोड पंक्ति John Doe की जानकारी लौटाती है:
df.iloc[0]
|
C123 |
|
|
Name |
John Doe |
|
Country |
United States |
|
Region |
North America |
|
Age |
67 |
.iloc का उपयोग करके एकाधिक पंक्तियाँ चुनना
.iloc में एकाधिक पंक्तियाँ चुनना .loc जैसा ही काम करता है—हम पंक्ति सूचकांक पूर्णांकों को वर्ग कोष्ठकों वाली सूची में दर्ज करते हैं। वाक्य-विन्यास इस तरह दिखता है: df.iloc[[0, 3, 4]]।
हमारी ग्राहक तालिका में संबंधित आउटपुट नीचे देखा जा सकता है:
df.iloc[[0, 3, 4]]
|
Customer ID |
Name |
Country |
Region |
Age |
|
C123 |
John Doe |
United States |
North America |
67 |
|
C456 |
Maria Gonzalez |
Mexico |
North America |
26 |
|
C567 |
David Lee |
China |
Asia |
40 |
.iloc का उपयोग करके पंक्तियों का स्लाइस चुनना
पंक्तियों का स्लाइस चुनने के लिए, हम दो निर्दिष्ट पंक्ति सूचकांक पूर्णांकों के बीच कॉलन का उपयोग करते हैं। अब, हमें पहले बताई गई अपवर्जकता पर ध्यान देना होगा।
हम इस धारणा को समझाने के लिए पंक्ति df.iloc[1:4] ले सकते हैं। सूचकांक संख्या 1 का अर्थ है दूसरी पंक्ति, इसलिए हमारा स्लाइस वहीं से शुरू होता है। सूचकांक पूर्णांक 4 पाँचवीं पंक्ति को दर्शाता है — लेकिन चूँकि .iloc स्लाइस चयन के लिए समावेशी नहीं है, हमारा आउटपुट इस पंक्ति से ठीक पहले तक की सभी पंक्तियाँ शामिल करेगा। इसलिए, यह दूसरी, तीसरी और चौथी पंक्ति लौटाएगा।
आइए साबित करें कि यह पंक्ति अपेक्षा के अनुसार काम करती है:
df.iloc[1:4]
|
Customer ID |
Name |
Country |
Region |
Age |
|
C234 |
Petra Müller |
Germany |
Europe |
51 |
|
C345 |
Ali Khan |
Pakistan |
Asia |
19 |
|
C456 |
Maria Gonzalez |
Mexico |
North America |
26 |
.iloc का उपयोग करके एकल स्तंभ चुनना
.iloc से स्तंभ चुनने का तर्क अब तक जो हमने सीखा है उसका अनुसरण करता है। आइए देखें यह एकल स्तंभ, एकाधिक स्तंभ, और स्तंभ स्लाइस के लिए कैसे काम करता है।
.loc की तरह ही, column_indexer पर जाने से पहले row_indexer निर्दिष्ट करना महत्वपूर्ण है। df की प्रत्येक पंक्ति के लिए तीसरे स्तंभ के मान प्राप्त करने हेतु हम df.iloc[:, 2] दर्ज करते हैं।
क्योंकि हमारे DataFrame में Region तीसरा स्तंभ है, इस कोड पंक्ति के परिणामस्वरूप वही प्राप्त होगा:
df.iloc[:, 2]
|
Customer ID |
Region |
|
C123 |
North America |
|
C234 |
Europe |
|
C345 |
Asia |
|
C456 |
North America |
|
C567 |
Asia |
.iloc का उपयोग करके एकाधिक स्तंभ चुनना
ऐसे कई स्तंभ चुनने के लिए जो अनिवार्य रूप से क्रमागत न हों, हम फिर से column_indexer के रूप में पूर्णांकों वाली सूची दर्ज कर सकते हैं। पंक्ति df.iloc[:, [0, 3]] पहला और चौथा दोनों स्तंभ लौटाती है।
हमारे मामले में, प्रदर्शित जानकारी प्रत्येक ग्राहक का Name तथा Age है:
df.iloc[:, [0, 3]]
|
Customer ID |
Name |
Age |
|
C123 |
John Doe |
67 |
|
C234 |
Petra Müller |
51 |
|
C345 |
Ali Khan |
19 |
|
C456 |
Maria Gonzalez |
26 |
|
C567 |
David Lee |
40 |
.iloc का उपयोग करके स्तंभों का स्लाइस चुनना
.iloc के साथ स्लाइस चयन के लिए, column_indexer का तर्क row_indexer जैसा ही है। कॉलन के बाद जिस पूर्णांक द्वारा स्तंभ दर्शाया गया है, वह आउटपुट में शामिल नहीं होता। दूसरा और तीसरा स्तंभ प्राप्त करने के लिए, कोड पंक्ति इस प्रकार होनी चाहिए: df.iloc[:, 1:3]।
नीचे दी गई पंक्ति हमारे ग्राहकों के बारे में उपलब्ध सभी भौगोलिक जानकारी लौटाती है:
df.iloc[:, 1:3]
|
Customer ID |
Country |
Region |
|
C123 |
United States |
North America |
|
C234 |
Germany |
Europe |
|
C345 |
Pakistan |
Asia |
|
C456 |
Mexico |
North America |
|
C567 |
China |
Asia |
.iloc के साथ संयुक्त पंक्ति और स्तंभ चयन
हम .iloc के बारे में जो सीखे हैं, उन्हें मिलाकर पंक्ति और स्तंभ चयन को संयोजित कर सकते हैं। फिर से, एकल सेल या उप-DataFrame दोनों लौटाना संभव है। पंक्ति 3 और स्तंभ 4 के प्रतिच्छेद पर एकल सेल लौटाने के लिए हम df.iloc[2, 3] दर्ज करते हैं।
.loc की तरह ही, हम दोनों इंडेक्सर्स को सूची के रूप में वर्ग कोष्ठकों से या कॉलन के साथ स्लाइस के रूप में निर्दिष्ट कर सकते हैं। यदि हम शर्तात्मक अभिव्यक्तियों का उपयोग करके पंक्तियाँ चुनना चाहते हैं, तो वह तकनीकी रूप से .iloc के साथ भी संभव है, लेकिन अनुशंसित नहीं। लेबल नामों और .loc का उपयोग आमतौर पर अधिक सहज और त्रुटि-रोधी होता है।
यह अंतिम उदाहरण हमारे DataFrame की पहली, दूसरी और पाँचवीं पंक्ति के लिए Country, Region और Age दिखाता है:
df.iloc[[0,1,4], 1:4]
|
Customer ID |
Country |
Region |
Age |
|
C123 |
United States |
North America |
67 |
|
C234 |
Germany |
Europe |
51 |
|
C567 |
China |
Asia |
40 |
.iloc बनाम .loc: किसे कब उपयोग करें
आम तौर पर, एक आसान नियम है जहाँ विधि का चयन आपके DataFrame के बारे में ज्ञान पर निर्भर करता है:
.locका उपयोग करें जब आपको पंक्तियों/स्तंभों के लेबल (नाम) पता हों।- .iloc का उपयोग करें जब आपको पंक्तियों/स्तंभों की पूर्णांक स्थितियाँ पता हों।
कुछ परिदृश्यों में स्वभावतः .loc या .iloc में से किसी एक का पक्ष होता है। उदाहरण के लिए, पंक्तियों या स्तंभों पर इटरेट करना लेबल्स की तुलना में पूर्णांकों से आसान और अधिक सहज होता है। जैसा कि हमने पहले उल्लेख किया, स्तंभ मानों पर आधारित शर्तों के अनुसार पंक्तियों को फ़िल्टर करना स्तंभ लेबल नामों का उपयोग करते समय कम त्रुटिप्रवण होता है।
|
.loc को प्राथमिकता देने वाले परिदृश्य |
.iloc को प्राथमिकता देने वाले परिदृश्य |
|
आपके DataFrame में अर्थपूर्ण इंडेक्स/स्तंभ नाम हैं। |
आप पंक्तियों/स्तंभों पर उनकी स्थिति के अनुसार इटरेट कर रहे हैं। |
|
आपको स्तंभ मानों पर शर्त आधारित फ़िल्टरिंग करनी है। |
इंडेक्स/स्तंभ नाम आपके कार्य के लिए प्रासंगिक नहीं हैं। |
.loc और .iloc के साथ KeyError, NameError, और IndexError
आइए संभावित समस्याओं पर नज़र डालें। .loc का उपयोग करते समय एक सामान्य गलती है KeyError का सामना करना। यह त्रुटि तब होती है जब हम किसी ऐसी पंक्ति या स्तंभ लेबल तक पहुँचने की कोशिश करते हैं जो हमारे DataFrame में मौजूद नहीं है। इससे बचने के लिए, हमें हमेशा यह सुनिश्चित करना चाहिए कि जिन लेबल्स का हम उपयोग कर रहे हैं वे सटीक हों, आपके DataFrame में मौजूद लेबल्स से मेल खाते हों, और टाइपो के लिए दोबारा जाँचें।
इसके अलावा, .loc के साथ निर्दिष्ट लेबल्स के लिए हमेशा उद्धरण चिह्नों का उपयोग करना महत्वपूर्ण है। उन्हें भूल जाने पर NameError मिलेगा।
एक IndexError तब हो सकता है जब हम .iloc का उपयोग करते हुए ऐसा पूर्णांक स्थान निर्दिष्ट करें जो हमारे DataFrame के सूचकांकों की वैध सीमा से बाहर हो। यह तब होता है जब वह सूचकांक मौजूद नहीं होता—या तो इसलिए कि वह आपके DataFrame में पंक्तियों या स्तंभों की संख्या से अधिक है, या इसलिए कि वह नकारात्मक मान है। इस त्रुटि से बचने के लिए, अपने DataFrame के आयाम जाँचें और वैध सीमा के भीतर उपयुक्त सूचकांक मानों का उपयोग करें।
निष्कर्ष
आशा है यह ब्लॉग सहायक रहा होगा और अब .loc और .iloc के बीच का भेद स्पष्ट है। और सीखने के लिए, ये कुछ अच्छे अगले कदम हैं:
टॉम एक डेटा साइंटिस्ट और तकनीकी शिक्षक हैं। वे DataCamp के डेटा साइंस ट्यूटोरियल्स और ब्लॉग पोस्ट लिखते और प्रबंधित करते हैं। इससे पहले, टॉम ने Deutsche Telekom में डेटा साइंस में काम किया था।
