पांडा (Pandas) पाइथन की एक शक्तिशाली ओपन-सोर्स लाइब्रेरी है जिसका उपयोग डेटा के विश्लेषण, सफाई, प्रबंधन और प्रसंस्करण के लिए किया जाता है। इसे वेस मैककिनी (Wes McKinney) ने 2008 में विकसित किया था। पांडा का नाम 'पैनल डेटा' (Panel Data) से लिया गया है, इसका संक्षिप्त रूप 'पैन-डा' है। यह लाइब्रेरी न्यूमपाई (NumPy) पर आधारित है और डेटा विश्लेषण के लिए दो मुख्य डेटा संरचनाएं प्रदान करती है — सीरीज़ (Series) और डेटाफ्रेम (DataFrame)। पांडा का उपयोग करने के लिए इसे आयात (import) करना अनिवार्य होता है।
import pandas as pd
पांडा को सामान्यतः pd के रूप में आयात किया जाता है, जिससे कोड छोटा और पढ़ने में सरल हो जाता है। पांडा मुख्य रूप से संरचित (tabular) डेटा, जैसे सारणीबद्ध डेटा, स्प्रेडशीट डेटा, समय श्रृंखला डेटा आदि के साथ कार्य करता है।
पांडा की दो प्रमुख डेटा संरचनाएं निम्नलिखित हैं:
सीरीज़ एक-आयामी (1-D) लेबल वाली सरणी होती है जो किसी भी प्रकार के डेटा (पूर्णांक, स्ट्रिंग, फ्लोट आदि) को धारण कर सकती है। सीरीज़ में प्रत्येक तत्व एक सूचकांक (Index) से जुड़ा होता है। यह एक कॉलम या एक पंक्ति के डेटा को संग्रहीत करती है।
import pandas as pd
s = pd.Series([10, 20, 30, 40])
print(s)
उपरोक्त कोड में सीरीज़ बनाने के लिए सूची (List) को pd.Series() में भेजा गया है। डिफ़ॉल्ट सूचकांक 0, 1, 2, 3 होगा। हम index पैरामीटर का उपयोग करके अपने स्वयं के सूचकांक भी प्रदान कर सकते हैं:
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s['b'])
डेटाफ्रेम दो-आयामी (2-D) लेबल वाली डेटा संरचना होती है, जो सारणी (टेबल) की तरह पंक्तियों और स्तंभों में डेटा को व्यवस्थित करती है। इसे विभिन्न तरीकों से बनाया जा सकता है — शब्दकोश (Dictionary), सूची, एनडीएरे आदि से।
import pandas as pd
data = {
'नाम': ['राम', 'श्याम', 'सीता'],
'अंक': [85, 90, 78]
}
df = pd.DataFrame(data)
print(df)
यहाँ शब्दकोश की कुंजियां (keys) स्तंभ नाम बन जाती हैं और मान (values) स्तंभ डेटा बन जाते हैं। index पैरामीटर के द्वारा पंक्ति सूचकांक भी निर्धारित किए जा सकते हैं।
सीरीज़ को निम्नलिखित स्रोतों से बनाया जा सकता है:
pd.Series([1, 2, 3])pd.Series((1, 2, 3))pd.Series({'a': 1, 'b': 2})pd.Series(5, index=[0, 1, 2])pd.Series(np.array([1, 2, 3]))import pandas as pd
d = {'दिल्ली': 45, 'मुंबई': 60, 'कोलकाता': 55}
s = pd.Series(d)
print(s)
शब्दकोश से बनाए गए सीरीज़ में शब्दकोश की कुंजियां सूचकांक और मान सीरीज़ के तत्व बन जाते हैं। यह विधि डेटा को व्यवस्थित रूप से संग्रहीत करने में बहुत सहायक है।
सीरीज़ डेटा के साथ कार्य करने हेतु कई उपयोगी गुणधर्म (attributes) और विधियां (methods) प्रदान करती है:
s.values — सीरीज़ के सभी मानों को एनडीएरे के रूप में लौटाता है।s.index — सीरीज़ का सूचकांक ऑब्जेक्ट लौटाता है।s.dtype — सीरीज़ के डेटा का डेटाटाइप बताता है।s.shape — सीरीज़ की आकृति (आयाम) लौटाता है, जैसे (3,)।s.size — सीरीज़ में तत्वों की कुल संख्या बताता है।s.empty — बताता है कि सीरीज़ खाली है या नहीं (बूलियन)।s.name — सीरीज़ का नाम बताता या निर्धारित करता है।s.hasnans — बताता है कि सीरीज़ में NaN मान मौजूद हैं या नहीं।import pandas as pd
s = pd.Series([5, 10, 15], index=['a', 'b', 'c'], name='अंक')
print(s.shape)
print(s.dtype)
print(s.name)
सीरीज़ पर विभिन्न अंकगणितीय संक्रियाएं (जोड़, घटाव, गुणा, भाग) तत्व-वार (element-wise) आधार पर की जाती हैं।
import pandas as pd
s = pd.Series([10, 20, 30])
print(s + 5)
print(s * 2)
print(s - 3)
print(s / 2)
दो सीरीज़ों के बीच संक्रिया करने पर पांडा सूचकांकों के आधार पर संरेखण (alignment) करता है। यदि दोनों सीरीज़ों के सूचकांक समान नहीं हैं, तो मेल न खाने वाले स्थानों पर NaN (Not a Number) मान उत्पन्न होता है।
import pandas as pd
s1 = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
s2 = pd.Series([10, 20, 30], index=['a', 'b', 'd'])
print(s1 + s2)
यहाँ c और d सूचकांकों के लिए परिणाम NaN होगा, क्योंकि दोनों सीरीज़ों में इन सूचकांकों का मान नहीं मिलता। पांडा का यह संरेखण व्यवहार (alignment behavior) इसकी एक प्रमुख विशेषता है।
सीरीज़ में तत्वों को दो प्रकार से एक्सेस किया जा सकता है — स्थिति आधारित (position based) और लेबल आधारित (label based)।
s['a']s[0]s[0:2] या s['a':'c']import pandas as pd
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(s['b'])
print(s[1])
print(s[1:3])
print(s['b':'d'])
ध्यान दें कि लेबल आधारित स्लाइसिंग में अंतिम सूचकांक भी शामिल होता है, जबकि स्थिति आधारित स्लाइसिंग में अंतिम सूचकांक शामिल नहीं होता। यह एक महत्वपूर्ण अंतर है जिसे परीक्षा में प्रायः पूछा जाता है।
डेटाफ्रेम को निम्नलिखित विधियों से बनाया जा सकता है:
import pandas as pd
data = {'A': [1, 2], 'B': [3, 4]}
df = pd.DataFrame(data)
print(df)
df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])
print(df)
import numpy as np
arr = np.array([[1, 2], [3, 4]])
df = pd.DataFrame(arr, columns=['A', 'B'])
print(df)
s1 = pd.Series([10, 20], name='अंक1')
s2 = pd.Series([30, 40], name='अंक2')
df = pd.DataFrame({'अंक1': s1, 'अंक2': s2})
print(df)
डेटाफ्रेम से डेटा एक्सेस करने के लिए निम्नलिखित विधियों का उपयोग किया जाता है:
df['स्तंभ'] — एक विशेष स्तंभ को सीरीज़ के रूप में लौटाता है।df[['स्तंभ1', 'स्तंभ2']] — एक से अधिक स्तंभों को डेटाफ्रेम के रूप में लौटाता है।df.loc[सूचकांक] — लेबल आधारित पंक्ति एक्सेस करता है।df.iloc[स्थिति] — स्थिति आधारित पंक्ति एक्सेस करता है।df.head(n) — पहली n पंक्तियां लौटाता है (डिफ़ॉल्ट 5)।df.tail(n) — अंतिम n पंक्तियां लौटाता है (डिफ़ॉल्ट 5)।df.describe() — सांख्यिकीय सारांश लौटाता है।import pandas as pd
df = pd.DataFrame({
'नाम': ['राम', 'सीता', 'गीता'],
'अंक': [85, 92, 78]
}, index=['r1', 'r2', 'r3'])
print(df['अंक'])
print(df.loc['r2'])
print(df.iloc[1])
print(df.head(2))
loc और iloc के बीच का अंतर सबसे महत्वपूर्ण है — loc लेबल का उपयोग करता है जबकि iloc स्थिति (0 से प्रारंभ) का उपयोग करता है।
describe() विधि डेटाफ्रेम के संख्यात्मक स्तंभों के लिए सांख्यिकीय सारांश जैसे गणना (count), माध्य (mean), मानक विचलन (std), न्यूनतम (min), अधिकतम (max), तथा क्वार्टाइल (25%, 50%, 75%) प्रदान करती है।
import pandas as pd
df = pd.DataFrame({'अंक': [85, 90, 78, 92, 88]})
print(df.describe())
यह सांख्यिकीय विश्लेषण के लिए बहुत उपयोगी है। परीक्षा में प्रायः count, mean, std, min, max और क्वार्टाइल के मानों के बारे में प्रश्न पूछे जाते हैं।
पांडा में डेटा के सशर्त चयन के लिए बूलियन मास्क का उपयोग अत्यंत उपयोगी है। बूलियन मास्क एक सीरीज़ होती है जिसमें प्रत्येक तत्व के लिए True या False मान होता है। जब इस मास्क को डेटाफ्रेम या सीरीज़ पर लगाया जाता है, तो केवल उन्हीं तत्वों का चयन होता है जिनके लिए मान True होता है। उदाहरण के लिए, mask = df['अंक'] > 80 एक बूलियन सीरीज़ बनाता है और df[mask] केवल 80 से अधिक अंक वाली पंक्तियां लौटाता है। इसी प्रकार & (AND) और | (OR) संचालकों से कई शर्तों को जोड़ा जा सकता है। सूचकांकों के संरेखण के कारण यह विधि सटीक और तेज होती है। इसके अलावा df[df['शहर'].isin(['दिल्ली', 'मुंबई'])] जैसी विधि से विशिष्ट मानों वाली पंक्तियां चुनी जाती हैं। बूलियन मास्क का उपयोग करते समय यह ध्यान रखना चाहिए कि सशर्त चयन में परिणाम नई डेटा संरचना होती है और मूल डेटा में कोई परिवर्तन नहीं होता, जब तक कि inplace=True न दिया जाए। यह संकल्पना डेटा विश्लेषण का आधार है और अगले अध्यायों में फ़िल्टरिंग तथा डेटा सफाई में व्यापक रूप से उपयोग होती है, अतः विद्यार्थियों को इसे ध्यानपूर्वक समझना चाहिए। परीक्षा में बूलियन मास्क से संबंधित प्रश्नों का अभ्यास करना अत्यंत लाभदायक होता है।
| स्रोत | कोड उदाहरण | विशेषता |
|---|---|---|
| सूची (List) | pd.Series([1, 2, 3]) |
डिफ़ॉल्ट सूचकांक 0 से प्रारंभ |
| टपल (Tuple) | pd.Series((1, 2, 3)) |
सूची के समान व्यवहार |
| शब्दकोश (Dict) | pd.Series({'a': 1}) |
कुंजी = सूचकांक |
| स्केलर मान | pd.Series(5, index=[0, 1]) |
सभी तत्व समान मान |
| एनडीएरे (ndarray) | pd.Series(np.array([1, 2])) |
न्यूमपाई पर आधारित |
| गुणधर्म | कार्य |
|---|---|
s.values |
मानों को एनडीएरे के रूप में |
s.index |
सूचकांक ऑब्जेक्ट |
s.dtype |
डेटाटाइप |
s.shape |
आकृति (आयाम) |
s.size |
तत्वों की संख्या |
s.empty |
खाली होने की जांच (बूलियन) |
| विधि | कार्य | आधार |
|---|---|---|
df['कॉलम'] |
एक कॉलम को सीरीज़ में | लेबल |
df.loc[row] |
पंक्ति एक्सेस | लेबल |
df.iloc[row] |
पंक्ति एक्सेस | स्थिति |
df.head(n) |
पहली n पंक्तियां | स्थिति |
df.tail(n) |
अंतिम n पंक्तियां | स्थिति |
df.describe() |
सांख्यिकीय सारांश | सभी संख्यात्मक |
loc और iloc में भ्रम: विद्यार्थी प्रायः df.loc[0] का उपयोग स्थिति के लिए करते हैं, जबकि loc हमेशा लेबल के लिए होता है। यदि लेबल 0 से भिन्न हैं तो यह गलत परिणाम देगा।s['b':'d'] में 'd' भी शामिल होता है, जबकि स्थिति आधारित s[1:3] में स्थिति 3 शामिल नहीं होती। इस अंतर को भूलना सामान्य गलती है।import pandas as pd के बिना pd.Series का उपयोग करने पर NameError आती है।df.head() में तर्क नहीं देना: कई विद्यार्थी सोचते हैं कि df.head() सभी पंक्तियां लौटाता है, परंतु यह डिफ़ॉल्ट रूप से केवल पहली 5 पंक्तियां ही लौटाता है।pd.Series(5) बिना index के सूचकांक निर्धारित नहीं करता, जिससे वांछित परिणाम नहीं मिलता। index प्रदान करना आवश्यक है।loc और iloc के अंतर को सदैव याद रखें — यह परीक्षा में सर्वाधिक पूछा जाने वाला प्रश्न है।s.shape का आउटपुट टपल होता है, जैसे (3,) — इसे गलत समझने की संभावना रहती है।head(n) और tail(n) में n पैरामीटर दिया जा सकता है, डिफ़ॉल्ट मान 5 है।df.describe() के आउटपुट में count, mean, std, min, max तथा क्वार्टाइल की व्यवस्था याद रखें।पाइथन पांडा - I में हमने पांडा लाइब्रेरी की दो मूलभूत डेटा संरचनाओं — सीरीज़ और डेटाफ्रेम — के निर्माण, गुणधर्म, सूचकांकन तथा डेटा एक्सेस के तरीकों का अध्ययन किया। सीरीज़ एक-आयामी और डेटाफ्रेम दो-आयामी डेटा संरचनाएं हैं, जो डेटा विश्लेषण का आधार बनाती हैं। loc और iloc का अंतर, सूचकांक संरेखण तथा डेटा एक्सेस की विधियां इस अध्याय के प्रमुख केंद्र बिंदु हैं। इन मूलभूत अवधारणाओं की पकड़ मजबूत होने से अगले अध्यायों में डेटा प्रबंधन और विश्लेषण सरल हो जाएगा। अगले अध्याय में हम डेटाफ्रेम में पंक्तियों और स्तंभों को जोड़ने, हटाने, डेटा फ़िल्टर करने तथा डेटाफ्रेम को जोड़ने (concatenation) के तरीकों का अध्ययन करेंगे।