अध्याय 02 पांडा का उपयोग करके डेटा हैंडलिंग-01
“यदि आप ध्यान से नहीं सोचते, तो आप यह मान सकते हैं कि प्रोग्रामिंग केवल एक प्रोग्रामिंग भाषा में कथन टाइप करना है।”
— व. कनिंघम
2.1 Python लाइब्रेरीज़ का परिचय
Python लाइब्रेरीज़ में बिल्ट-इन मॉड्यूल्स का एक संग्रह होता है जो हमें कई कार्यों को उनके लिए विस्तृत प्रोग्राम लिखे बिना करने की अनुमति देता है। Python में प्रत्येक लाइब्रेरी में बड़ी संख्या में मॉड्यूल्स होते हैं जिन्हें आयात करके उपयोग किया जा सकता है।
NumPy, Pandas और Matplotlib वैज्ञानिक और विश्लेषणात्मक उपयोग के लिए तीन प्रतिष्ठित Python लाइब्रेरीज़ हैं। ये लाइब्रेरीज़ हमें डेटा को आसानी और दक्षता से हेरफेर, रूपांतरित और दृश्य बनाने की अनुमति देती हैं।
NumPy, जिसका अर्थ है ‘Numerical Python’, एक ऐसी लाइब्रेरी है जिसकी हमने कक्षा ग्यारह में चर्चा की थी। याद कीजिए, यह एक पैकेज है जिसे संख्यात्मक डेटा विश्लेषण और वैज्ञानिक कम्प्यूटिंग के लिए उपयोग किया जा सकता है। NumPy एक बहुआयामी array ऑब्जेक्ट का उपयोग करता है और इन arrays के साथ काम करने के लिए फंक्शन्स और टूल्स रखता है। Array के तत्व स्मृति में एक साथ रहते हैं, इसलिए उन्हें तेजी से एक्सेस किया जा सकता है।
PANDAS (PANelDAta) एक उच्च-स्तरीय डेटा हेरफेर टूल है जिसका उपयोग डेटा का विश्लेषण करने के लिए किया जाता है। Pandas लाइब्रेरी का उपयोग करके डेटा को आयात और निर्यात करना बहुत आसान है जिसमें फंक्शन्स का एक बहुत समृद्ध समूह है। यह NumPy और Matplotlib जैसे पैकेजों पर बना है और हमें डेटा विश्लेषण और दृश्य बनाने का अधिकांश काम एक ही सुविधाजनक स्थान पर करने देता है। Pandas में तीन महत्वपूर्ण डेटा संरचनाएं हैं, अर्थात् Series, DataFrame और Panel, जो डेटा का विश्लेषण करने की प्रक्रिया को व्यवस्थित, प्रभावी और दक्ष बनाती हैं।
पायथन में Matplotlib लाइब्रेरी ग्राफ़ प्लॉट करने और विज़ुअलाइज़ेशन के लिए उपयोग की जाती है। Matplotlib की मदद से मात्र कुछ पंक्तियों के कोड से ही हम प्रकाशन-गुणवत्ता वाले प्लॉट, हिस्टोग्राम, बार चार्ट, स्कैटरप्लॉट आदि उत्पन्न कर सकते हैं। यह Numpy पर भी आधारित है और Numpy तथा Pandas के साथ अच्छे से काम करने के लिए डिज़ाइन की गई है।
आप सोच सकते हैं कि जब NumPy डेटा विश्लेषण के लिए उपयोग किया जा सकता है, तब Pandas की क्या ज़रूरत है। नीचे Pandas और NumPy के बीच कुछ अंतर दिए गए हैं:
- NumPy array समरूप डेटा की आवश्यकता होती है, जबकि Pandas DataFrame में विभिन्न डेटा प्रकार (float, int, string, datetime आदि) हो सकते हैं।
- Pandas में फ़ाइल लोडिंग, प्लॉटिंग, चयन, जॉइनिंग, GROUP BY जैसे संचालनों के लिए सरल इंटरफ़ेस होता है, जो डेटा-प्रोसेसिंग अनुप्रयोगों में बहुत उपयोगी सिद्ध होते हैं।
- Pandas DataFrames (कॉलम नामों के साथ) डेटा को ट्रैक करना बहुत आसान बना देते हैं।
- जब डेटा टैब्युलर प्रारूप में होता है तब Pandas का उपयोग किया जाता है, जबकि NumPy संख्यात्मक array आधारित डेटा मैनिपुलेशन के लिए उपयोग किया जाता है।
2.1.1. Pandas इंस्टॉल करना
Pandas इंस्टॉल करना NumPy इंस्टॉल करने के समान ही है। कमांड लाइन से Pandas इंस्टॉल करने के लिए हमें टाइप करना होगा:
$$ \text { pip install pandas } $$
ध्यान दें कि NumPy और Pandas दोनों तभी इंस्टॉल किए जा सकते हैं जब उस सिस्टम पर पहले से Python इंस्टॉल हो। यही बात Python की अन्य लाइब्रेरीज़ के लिए भी सच है।
2.1.2. Pandas में डेटा संरचना
एक डेटा संरचना डेटा मानों और उस डेटा पर लागू होने वाले संचालनों का एक संग्रह है। यह डेटा को कुशलता से संग्रहीत, पुनः प्राप्त और संशोधित करने में सक्षम बनाती है। उदाहरण के लिए, हमने कक्षा XI में NumPy में ndarray नामक डेटा संरचना के साथ पहले से काम किया है। याद कीजिए कि NumPy array का उपयोग करके डेटा को संग्रहीत, एक्सेस और अपडेट करना कितना आसान था। Pandas में दो सामान्यतः प्रयुक्त डेटा संरचनाएँ जिन्हें हम इस पुस्तक में कवर करेंगे, वे हैं:
- Series
- DataFrame
2.2 Series
Series एक एक-आयामी array है जिसमें किसी भी डेटा प्रकार (int, float, list, string, आदि) के मानों का एक क्रम होता है जिनके साथ डिफ़ॉल्ट रूप से शून्य से शुरू होने वाले संख्यात्मक डेटा लेबल होते हैं। किसी विशेष मान से जुड़ा डेटा लेबल उसका index कहलाता है। हम index के रूप में अन्य डेटा प्रकारों के मान भी निर्धारित कर सकते हैं। हम Pandas Series को एक स्प्रेडशीट में एक कॉलम के रूप में कल्पना कर सकते हैं। नीचे विद्यार्थियों के नामों वाली एक series का उदाहरण दिया गया है:
Index $\quad$ Value
0 $\quad$ अर्नब
1 $\quad$ समृद्धि
2 $\quad$ रमित
3 $\quad$ दिव्यम्
4 $\quad$ कृतिका
2.2.1 Series का निर्माण
Pandas में series को बनाने के विभिन्न तरीके हैं। Series बनाने या उपयोग करने के लिए, हमें पहले Pandas library आयात करनी होती है।
(A) स्केलर मानों से Series का निर्माण
एक Series स्केलर मानों का उपयोग करके बनाई जा सकती है जैसा कि नीचे उदाहरण में दिखाया गया है:
>>> import pandas as pd #Pandas को pd उपनाम से आयात करें
>>> series1 = pd.Series([10,20,30]) #एक Series बनाएँ
>>> print(series1) #series प्रदर्शित करें
Output:
0 $\quad$ 10
1 $\quad$ 20
2 $\quad$ 30
dtype: int 64
गतिविधि 2.1
भारत के किन्हीं पाँच प्रसिद्ध स्मारकों के नामों की एक श्रृंखला बनाएँ और उनके राज्यों को सूचकांक मानों के रूप में निर्धारित करें।
ध्यान दें कि आउटपुट दो स्तंभों में दिखाया गया है — बाईं ओर सूचकांक है और दाईं ओर डेटा मान है। यदि हम डेटा मानों के लिए स्पष्ट रूप से कोई सूचकांक निर्दिष्ट नहीं करते हैं, तो डिफ़ॉल्ट रूप से सूचकांक 0 से $N-1$ तक होते हैं। यहाँ $N$ डेटा तत्वों की संख्या है।
हम सूचकांक को उपयोगकर्ता-परिभाषित लेबल भी दे सकते हैं और उनका उपयोग करके श्रृंखला के तत्वों को एक्सेस कर सकते हैं। निम्न उदाहरण में सूचकांक यादृच्छिक क्रम में संख्यात्मक है।
>>> series2 = pd.Series([“कवि”,“श्याम”,“रवि”], index=[3,5,1]) >>> print(series2) #श्रृंखला प्रदर्शित करें
आउटपुट:
3 $\quad$ कवि
5 $\quad$ श्याम
1 $\quad$ रवि
dtype: object
यहाँ, डेटा मान कवि, श्याम और रवि के सूचकांक मान क्रमशः 3, 5 और 1 हैं। हम अक्षरों या स्ट्रिंग्स को भी सूचकांक के रूप में उपयोग कर सकते हैं, उदाहरण के लिए:
>>> series2 = pd.Series([2,3,4],index=[“फर”,“मार”,“अप्र”])
>>> print(series2) #श्रृंखला प्रदर्शित करें
आउटपुट:
फर $\quad$ 2
मार $\quad$ 3
अप्र $\quad$ 4
dtype: int 64
यहाँ, डेटा मान 2,3,4 के सूचकांक मान क्रमशः फर, मार और अप्र हैं।
सोचें और विचार करें
क्या Pandas आयात करते समय हमेशा pd को उपनाम के रूप में उपयोग करना अनिवार्य है? यदि हम कोई अन्य नाम दें तो क्या होगा?
(B) NumPy सरणियों से श्रृंखला का निर्माण
हम एक एकल-आयामी (1D) NumPy सरणी से श्रृंखला बना सकते हैं, जैसा कि नीचे दिखाया गया है:
>>> import numpy as np # NumPy को np उपनाम से आयात करें
>>> import pandas as pd
>>> array1 = np.array([1,2,3,4])
>>> series3 = pd.Series(array1)
>>> print(series3)
आउटपुट:
0 $\quad$ 1
1 $\quad$ 2
2 $\quad$ 3
3 $\quad$ 4
dtype: int 32
निम्न उदाहरण दर्शाता है कि हम इंडेक्स के रूप में अक्षरों या स्ट्रिंग्स का उपयोग कर सकते हैं:
>>> series4 = pd.Series(array1, index = [“Jan”, “Feb”, “Mar”, “Apr”])
>>> print(series4)
जब इंडेक्स लेबल्स ऐरे के साथ पास किए जाते हैं, तो इंडेक्स और ऐरे की लंबाई समान होनी चाहिए, अन्यथा यह ValueError उत्पन्न करेगा। नीचे दिखाए गए उदाहरण में, array1 में 4 मान हैं जबकि केवल 3 इंडेक्स हैं, इसलिए ValueError प्रदर्शित होता है।
>>> series5 = pd.Series(array1, index = [“Jan”, “Feb”, “Mar”])
ValueError: Length of passed values is 4, index implies 3
(C) डिक्शनरी से सीरीज़ का निर्माण
याद कीजिए कि Python डिक्शनरी में key: value जोड़े होते हैं और जब key ज्ञात हो तो value को शीघ्र प्राप्त किया जा सकता है। डिक्शनरी की keys का उपयोग सीरीज़ के लिए इंडेक्स बनाने में किया जा सकता है, जैसा कि निम्न उदाहरण में दिखाया गया है। यहाँ, डिक्शनरी dict1 की keys सीरीज़ में इंडेक्स बन जाती हैं।
>>> dict1 = {‘India’: ‘NewDelhi’, ‘UK’: ‘London’, ‘Japan’: ‘Tokyo’}
>>> print(dict1) # डिक्शनरी प्रदर्शित करें {‘India’: ‘NewDelhi’, ‘UK’: ‘London’, ‘Japan’: ‘Tokyo’}
>>> series8 = pd.Series(dict1)
>>> print(series8) # सीरीज़ प्रदर्शित करें
India $\quad$ NewDelhi
UK $\quad$ London
Japan $\quad$ Tokyo
dtype: object
2.2.2 सीरीज़ के तत्वों तक पहुँचना
सीरीज़ के तत्वों तक पहुँचने के दो सामान्य तरीके हैं: इंडेक्सिंग और स्लाइसिंग।
(A) इंडेक्सिंग
सीरीज़ में इंडेक्सिंग नुम्पाय ऐरे की तरह ही होती है, और इसका उपयोग सीरीज़ में तत्वों तक पहुँचने के लिए किया जाता है। इंडेक्स दो प्रकार के होते हैं: पोज़िशनल इंडेक्स और लेबल्ड इंडेक्स। पोज़िशनल इंडेक्स एक पूर्णांक मान लेता है जो सीरीज़ में उसकी स्थिति से मेल खाता है, 0 से शुरू होकर, जबकि लेबल्ड इंडेक्स कोई उपयोगकर्ता-परिभाषित लेबल इंडेक्स के रूप में लेता है।
- निम्न उदाहरण सीरीज़ से मान तक पहुँचने के लिए पोज़िशनल इंडेक्स के उपयोग को दर्शाता है।
>>> seriesNum = pd.Series([10,20,30])
>>> seriesNum[2]
30
यहाँ, पोज़िशनल इंडेक्स 2 के लिए मान 30 प्रदर्शित होता है।
जब लेबल निर्दिष्ट किए जाते हैं, तो हम सीरीज़ से मान चुनते समय लेबल को इंडेक्स के रूप में उपयोग कर सकते हैं, जैसा नीचे दिखाया गया है। यहाँ, लेबल्ड इंडेक्स Mar के लिए मान 3 प्रदर्शित होता है।
>>> seriesMnths = pd.Series([2,3,4],index=[“Feb”,“Mar”,“Apr”])
>>> seriesMnths[“Mar”]
3
निम्न उदाहरण में, लेबल्ड इंडेक्स India के लिए मान NewDelhi प्रदर्शित होता है।
>>> seriesCapCntry = pd.Series([‘NewDelhi’, ‘WashingtonDC’, ‘London’, ‘Paris’], index=[‘India’, ‘USA’, ‘UK’, ‘France’])
>>> seriesCapCntry[‘India’]
‘NewDelhi’
गतिविधि 2.2
NewDelhi को आउटपुट के रूप में पाने के लिए पोज़िशनल इंडेक्स का उपयोग करते हुए कथन लिखें।
हम पोज़िशनल इंडेक्स का उपयोग करके भी सीरीज़ के तत्व तक पहुँच सकते हैं:
>>> seriesCapCntry[1]
‘WashingtonDC’
एक श्रेणी के एक से अधिक अवयवों को पूर्णांक स्थितियों की सूची या सूचकांक लेबलों की सूची का उपयोग करके इस प्रकार पहुँचा जा सकता है:
>>> seriesCapCntry[[3,2]]
France $\quad$ Paris
UK $\quad$ London
dtype: object
>>> seriesCapCntry[[‘UK’,‘USA’]]
UK $\quad$ London
USA $\quad$ WashingtonDC
dtype: object
श्रेणी से जुड़े सूचकांक मानों को नए सूचकांक मान निर्धारित करके बदला जा सकता है, जैसा कि निम्न उदाहरण में दिखाया गया है:
>>> seriesCapCntry.index=[10,20,30,40]
>>> seriesCapCntry
10 $\quad$ NewDelhi
20 $\quad$ WashingtonDC
30 $\quad$ London
40 $\quad$ Paris
dtype: object
(B) स्लाइसिंग
कभी-कभी हमें श्रेणी का एक भाग निकालने की आवश्यकता होती है। यह स्लाइसिंग द्वारा किया जा सकता है। यह NumPy arrays के साथ प्रयुक्त स्लाइसिंग के समान है। हम श्रेणी नाम के साथ प्रारंभ और अंत पैरामीटर [start:end] निर्दिष्ट करके यह बता सकते हैं कि श्रेणी का कौन-सा भाग स्लाइस किया जाना है। जब हम स्थिति-आधारित सूचकांकों का उपयोग स्लाइसिंग के लिए करते हैं, तो अंत-सूचकांक स्थिति पर स्थित मान को छोड़ दिया जाता है, अर्थात् केवल (end-start) संख्या के डेटा मान निकाले जाते हैं। निम्नलिखित श्रेणी seriesCapCntry पर विचार करें:
>>> seriesCapCntry = pd.Series([‘NewDelhi’, ‘WashingtonDC’, ‘London’, ‘Paris’], index=[‘India’, ‘USA’, ‘UK’, ‘France’])
>>> seriesCapCntry[1:3] #index position 3 पर स्थित मान को छोड़ता है
USA $\quad$ WashingtonDC
UK $\quad$ London
dtype: object
जैसा कि हम ऊपर के आउटपुट में देख सकते हैं, केवल सूचकांक 1 और 2 पर डेटा मान प्रदर्शित होते हैं। यदि स्लाइसिंग के लिए लेबल वाले सूचकांक उपयोग किए जाते हैं, तो अंत सूचकांक लेबल पर मान भी आउटपुट में शामिल होता है, उदाहरण के लिए:
>>> seriesCapCntry[‘USA’ : ‘France’]
USA $\quad$ वॉशिंगटनडीसी
UK $\quad$ लंदन
France $\quad$ पेरिस
dtype: object
हम श्रृंखला को उल्टे क्रम में भी प्राप्त कर सकते हैं, उदाहरण के लिए:
>>> seriesCapCntry[ : : -1]
France $\quad$ पेरिस
UK $\quad$ लंदन
USA $\quad$ वॉशिंगटनडीसी
India $\quad$ नईदिल्ली
dtype: object
हम श्रृंखला तत्वों के मानों को संशोधित करने के लिए स्लाइसिंग का भी उपयोग कर सकते हैं जैसा कि निम्न उदाहरण में दिखाया गया है:
>>> import numpy as np
>>> seriesAlph = pd.Series(np.arange(10,16,1), index = [‘a’, ‘b’, ‘c’, ’d’, ’e’, ‘f’])
>>> seriesAlph
a $\quad$ 10
b $\quad$ 11
c $\quad$ 12
d $\quad$ 13
e $\quad$ 14
f $\quad$ 15
dtype: int32
>>> seriesAlph[1:3] = 50
>>> seriesAlph
a $\quad$ 10
b $\quad$ 50
c $\quad$ 50
d $\quad$ 13
e $\quad$ 14
f $\quad$ 15
dtype: int32
ध्यान दें कि श्रृंखला में मानों को अद्यतन करने के लिए स्लाइसिंग का उपयोग करने पर अंत सूचकांक स्थिति पर मान को छोड़ा जाता है। लेकिन, जब लेबल का उपयोग करके स्लाइसिंग की जाती है तो अंत सूचकांक लेबल पर मान बदल जाता है।
>>> seriesAlph[‘c’:’e’] = 500
>>> seriesAlph
a $\quad$ 10
b $\quad$ 50
c $\quad$ 500
d $\quad$ 500
e $\quad$ 500
f $\quad$ 15
dtype: int32
2.2.3 श्रृंखला के गुणधर्म
हम किसी श्रेणी (series) के नाम के साथ उस गुणधर्म (attribute) का उपयोग करके उसके कुछ गुणधर्मों को एक्सेस कर सकते हैं। तालिका 2.1 कुछ पांडास श्रेणी के गुणधर्मों को उदाहरण के तौर पर seriesCapCntry के साथ सूचीबद्ध करती है:
>>> seriesCapCntry
India $\quad$ NewDelhi
USA $\quad$ WashingtonDC
UK $\quad$ London
France $\quad$ Paris
dtype: object
तालिका 2.1 पांडास श्रेणी के गुणधर्म
| गुणधर्म का नाम | उद्देश्य | उदाहरण |
|---|---|---|
| name | श्रेणी को एक नाम देता है | >>> seriesCapCntry.name = ‘Capitals’ >>> print(seriesCapCntry) India $\quad$ NewDelhi USA $\quad$ WashingtonDC UK $\quad$ London France $\quad$ Paris Name: Capitals, dtype: object |
| index.name | श्रेणी के इंडेक्स को नाम देता है | >>>seriesCapCntry. index. name $=$ ’ Countries’ >>>print(seriesCapCntry) Countries India $\quad$ NewDelhi USA $\quad$ WashingtonDC UK $\quad$ London France $\quad$ Paris Name: Capitals, dtype: object |
| values | श्रेणी में मौजूद मानों की सूची प्रिंट करता है | >>> print (seriesCapCntry. val ues) [‘NewDelhi’ ‘WashingtonDC’ ‘London’ ‘Paris’] |
| size | श्रेणी ऑब्जेक्ट में मौजूद मानों की संख्या प्रिंट करता है | >>>print(seriesCapCntry. size) 4 |
| empty | यदि श्रेणी खाली है तो True प्रिंट करता है, अन्यथा False | »> seriesCapCntry. empty False # एक खाली श्रेणी बनाएँ seriesEmpt=pd. Series() >>> seriesEmpt. empty True |
गतिविधि 2.3
निम्नलिखित कोड पर विचार करें:
>>>i mport pandas as pd
>>>i mport numpy as np
>>>s $2=p d$.
Series([12,np.nan, 10])
>>>ppint (s)उपरोक्त कोड का आउटपुट ज्ञात करें और ऊपर दी गई श्रृंखला में केवल गैर-खाली मानों की गिनती और प्रदर्शन के लिए एक Python कथन लिखें।
2.2.4 Series के तरीके
इस खंड में, हम कुछ ऐसे तरीकों की चर्चा करने जा रहे हैं जो Pandas Series के लिए उपलब्ध हैं। आइए निम्नलिखित श्रृंखला पर विचार करें:
>>> seriesTenTwenty=pd. Series(np. arange( 10, 20, 1 1)
>>> print(seriesTenTwenty)
$0 \quad 10$
$1 \quad 11$
$2 \quad 12$
$3 \quad 13$
$4 \quad 14$
$5 \quad 15$
$6 \quad 16$
$7 \quad 17$
$8 \quad 18$
$9 \quad 19$
dtype: int 32
| विधि | व्याख्या | उदाहरण |
|---|---|---|
| head(n) | श्रेणी के पहले n सदस्यों को लौटाता है। यदि n का मान पास नहीं किया गया है, तो डिफ़ॉल्ट रूप से n 5 लेता है और पहले पाँच सदस्य प्रदर्शित होते हैं। | >>>seriesTenTwenty.head(2) 0 $\quad$ 10 1 $\quad$ 11 dtype: int32 >>>seriesTenTwenty.head() 0 $\quad$ 10 1 $\quad$ 11 2 $\quad$ 12 3 $\quad$ 13 4 $\quad$ 14 dtype: int32 |
| count() | श्रेणी में गैर-NaN मानों की संख्या लौटाता है | >>>seriesTenTwenty.count()10 |
| tail(n) | श्रेणी के अंतिम n सदस्यों को लौटाता है। यदि n का मान पास नहीं किया गया है, तो डिफ़ॉल्ट रूप से n 5 लेता है और अंतिम पाँच सदस्य प्रदर्शित होते हैं। | >>> seriesTenTwenty.tail(2) 8 $\quad$ 18 9 $\quad$ 19 dtype: int32 >>> seriesTenTwenty.tail() 5 $\quad$ 15 6 $\quad$ 16 7 $\quad$ 17 8 $\quad$ 18 9 $\quad$ 19 dtype: int32 |
2.2.5 श्रेणी पर गणितीय संचालन
हमने कक्षा ग्यारह में सीखा है कि यदि हम दो NumPy arrays पर जोड़, घटाव, गुणा, भाग जैसे मूलभूत गणितीय संचालन करते हैं, तो संचालन प्रत्येक संगत युग्म के तत्वों पर किया जाता है। इसी प्रकार, हम Pandas में दो श्रेणियों पर गणितीय संचालन कर सकते हैं।
श्रेणियों पर गणितीय संचालन करते समय इंडेक्स मिलान लागू किया जाता है और सभी लापता मान डिफ़ॉल्ट रूप से NaN से भर दिए जाते हैं।
निम्नलिखित श्रृंखलाओं पर विचार करें: seriesA और seriesB पांडास में श्रृंखलाओं पर गणितीय संचालन को समझने के लिए।
>>> seriesA = pd.Series([1,2,3,4,5], index = [‘a’, ‘b’, ‘c’, ’d’, ’e’])
>>> seriesA
a $\quad$ 1
b $\quad$ 2
c $\quad$ 3
d $\quad$ 4
e $\quad$ 5
dtype: int64
>>> seriesB = pd.Series([10,20,-10,-50,100], index = [‘z’, ‘y’, ‘a’, ‘c’, ’e’])
>>> seriesB
z $\quad$ 10
y $\quad$ 20
a $\quad$ -10
c $\quad$ -50
e $\quad$ 100
dtype: int64
(A) दो श्रृंखलाओं का योग
इसे दो तरीकों से किया जा सकता है। पहली विधि में, दो श्रृंखलाओं को सरलता से एक साथ जोड़ा जाता है, जैसा कि निम्नलिखित कोड में दिखाया गया है। तालिका 2.2 योग करते समय मिलान किए गए विस्तृत मानों को दर्शाती है। यहाँ ध्यान दें कि यदि एक या दोनों अवयवों में कोई मान नहीं है तो योग का आउटपुट $\mathrm{NaN}$ होता है।
_>>> seriesA + seriesB
_
a $\quad$ -9.0
b $\quad$ NaN
c $\quad$ -47.0
d $\quad$ NaN
e $\quad$ 105.0
y $\quad$ NaN
z $\quad$ NaN
dtype: float64
तालिका 2.2 दो श्रृंखलाओं के योग का विवरण
| index | value from seriesA | value from seriesB | seriesA + seriesB |
|---|---|---|---|
| a | 1 | -10 | -9.0 |
| b | 2 | NaN | |
| c | 3 | -50 | -47.0 |
| d | 4 | $\mathrm{NaN}$ | |
| e | 5 | 100 | 105.00 |
| y | 20 | $\mathrm{NaN}$ | |
| z | 10 | $\mathrm{NaN}$ |
दूसरी विधि तब लागू होती है जब हम आउटपुट में NaN मान नहीं चाहते। हम सीरीज़ विधि add() और एक पैरामीटर fill_value का उपयोग करके गायब मान को एक निर्धारित मान से बदल सकते हैं। यानी seriesA.add(seriesB) को बुलाना seriesA+seriesB को बुलाने के समतुल्य है, लेकिन add() किसी भी ऐसे तत्व के लिए fill_value को स्पष्ट रूप से निर्दिष्ट करने की अनुमति देता है जो seriesA या seriesB में गायब हो सकता है, जैसा कि तालिका 2.3 में दिखाया गया है।
गतिविधि 2.4
तालिका 2.2 और 2.3 के समान घटाव के लिए दो तालिकाएँ बनाइए जो सीरीज़ तत्वों और संगत आउटपुट में बदलाव को दिखाएँ—पहले गायब मानों को बदले बिना, और फिर गायब मानों को 1000 से बदलने के बाद।
>>> seriesA.add(seriesB, fill_value=0)
a $\quad$ -9.0
b $\quad$ 2.0
c $\quad$ -47.0
d $\quad$ 4.0
e $\quad$ 105.0
y $\quad$ 20.0
z $\quad$ 10.0
dtype: float64
तालिका 2.3 add() विधि का उपयोग करके दो सीरीज़ के योग का विवरण
| index | value from seriesA | value from seriesB | seriesA + seriesB |
|---|---|---|---|
| a | 1 | -10 | -9.0 |
| b | 2 | 0 | 2.0 |
| c | 3 | -50 | -47.0 |
| d | 4 | 0 | 4.0 |
| e | 5 | 100 | 105.00 |
| y | 0 | 20 | 20.0 |
| z | 0 | 10 | 10.0 |
ध्यान दें कि तालिका 2.2 श्रेणी के तत्वों में परिवर्तन और अनुपस्थित मानों को बदले बिना संगत आउटपुट दिखाती है, जबकि तालिका 2.3 श्रेणी के तत्वों में परिवर्तन और अनुपस्थित मानों को 0 से बदलने के बाद संगत आउटपुट दिखाती है। जैसे जोड़, वैसे ही घटाव, गुणा और भाग भी संगत गणितीय संचालकों का उपयोग करके या उपयुक्त विधि की स्पष्ट कॉल करके किए जा सकते हैं।
गतिविधि 2.5
तालिकाओं 2.2 और 2.3 के समान गुणा के लिए दो तालिकाएँ बनाएँ जो अनुपस्थित मानों को बदले बिना और अनुपस्थित मानों को 0 से बदलने के बाद श्रेणी के तत्वों में परिवर्तन और संगत आउटपुट दिखाएँ।
(B) दो श्रेणियों का घटाव
इसे भी दो अलग-अलग तरीकों से किया जा सकता है, जैसा कि निम्नलिखित उदाहरणों में दिखाया गया है:[^0]
_>>> seriesA – seriesB #घटाव संचालक का उपयोग करते हुए
_
a $\quad$ 11.0
b $\quad$ NaN
c $\quad$ 53.0
d $\quad$ NaN
e $\quad$ -95.0
y $\quad$ NaN
z $\quad$ NaN
dtype: float64
आइए अब घटाव करने से पहले अनुपस्थित मानों को 1000 से बदलें, seriesB को seriesA से घटाने के लिए स्पष्ट घटाव विधि sub() का उपयोग करते हुए।
>>> seriesA.sub(seriesB, fill_value=1000)
# स्पष्ट कॉल करते समय fill value 1000 का उपयोग करना
$\quad$ # विधि की”
a $\quad$ 11.0
b $\quad$ -998.0
c $\quad$ 53.0
d $\quad$ -996.0
e $\quad$ -95.0
y $\quad$ 980.0
z $\quad$ 990.0
dtype: float64
(C) दो श्रेणियों का गुणा
फिर, इसे दो अलग-अलग तरीकों से किया जा सकता है, जैसा कि निम्नलिखित उदाहरणों में दिखाया गया है:
>>>seriesA * seriesB # गुणा ऑपरेटर का उपयोग करते हुए
a $\quad$ -10.0
b $\quad$ NaN
c $\quad$ -150.0
d $\quad$ NaN
e $\quad$ 500.0
y $\quad$ NaN
z $\quad$ NaN
dtype: float64
गतिविधि 2.6
विभाजन के लिए दो तालिकाएँ बनाइए जैसे तालिका 2.2 और 2.3, जिनमें श्रृंखला तत्वों में परिवर्तन और संगत आउटपुट दिखाया गया हो बिना लापता मानों को बदले, और लापता मानों को 0 से बदलने के बाद।
आइए अब लापता मानों को 0 से बदलते हैं seriesA और seriesB के गुणा से पहले स्पष्ट गुणा विधि mul() का उपयोग करके।
>>> seriesA.mul(seriesB, fill_value=0)
# गुणा करते समय fill value 0 का उपयोग करना
# विधि की स्पष्ट कॉल करना
a $\quad$ -10.0
b $\quad$ 0.0
c $\quad$ -150.0
d $\quad$ 0.0
e $\quad$ 500.0
y $\quad$ 0.0
z $\quad$ 0.0
dtype: float64
गणितीय संक्रिया के लिए स्पष्ट कॉल तब पसंद किया जाता है जब श्रृंखला में लापता मान हो सकते हैं और हम उन्हें किसी विशिष्ट मान से बदलना चाहते हैं ताकि $\mathrm{NaN}$ के स्थान पर एक ठोस आउटपुट प्राप्त हो सके।
(D) दो श्रृंखलाओं का विभाजन
फिर, इसे दो अलग-अलग तरीकों से किया जा सकता है, जैसा कि निम्नलिखित उदाहरणों में दिखाया गया है:
>>> seriesA/seriesB # विभाजन ऑपरेटर का उपयोग करते हुए
a $\quad$ -0.10
b $\quad$ NaN
c $\quad$ -0.06
d $\quad$ NaN
e $\quad$ 0.05
y $\quad$ NaN
z $\quad$ NaN
dtype: float64
आइए अब स्पष्ट विभाजन विधि $\operatorname{div}($ ) का उपयोग करके seriesA को seriesB से विभाजित करने से पहले लापता मानों को 0 से प्रतिस्थापित करें।
# स्पष्ट विधि को कॉल करते समय 0 भरने वाला मान का उपयोग करना
# विधि की कॉल
a $\quad$ -0.10
b $\quad$ inf
c $\quad$ -0.06
d $\quad$ inf
e $\quad$ 0.05
y $\quad$ 0.00
z $\quad$ 0.00
dtype: float64
2.3 DataFrame
कभी-कभी हमें एक साथ कई कॉलम पर काम करना होता है, अर्थात् हमें सारणीबद्ध डेटा को प्रोसेस करना होता है। उदाहरण के लिए, किसी कक्षा का परिणाम, किसी रेस्तरां की मेन्यू में आइटम, किसी ट्रेन का आरक्षण चार्ट आदि। Pandas ऐसे सारणीबद्ध डेटा को DataFrame का उपयोग करके संग्रहीत करता है। DataFrame एक द्वि-आयामी लेबलयुक्त डेटा संरचना है जैसे MySQL की तालिका। इसमें पंक्तियाँ और कॉलम होते हैं, और इसलिए इसमें पंक्ति तथा कॉलम दोनों की अनुक्रमणिका होती है। प्रत्येक कॉलम में अलग-अलग प्रकार के मान हो सकते हैं जैसे संख्यात्मक, स्ट्रिंग, बूलियन आदि, जैसे डेटाबेस की तालिकाओं में होता है।
| राज्य | भौगोलिक क्षेत्र (वर्ग किमी) | अत्यंत घने वनों के अंतर्गत क्षेत्र (वर्ग किमी) | |
|---|---|---|---|
| 1 | असम | 78438 | 2797 |
| 2 | दिल्ली | 1483 | 6.72 |
| 3 | केरल | 38852 | 1663 |
2.3.1 DataFrame का निर्माण
DataFrame बनाने के कई तरीके हैं। उनमें से कुछ इस खंड में सूचीबद्ध हैं।
(A) एक खाली DataFrame का निर्माण
एक खाली DataFrame इस प्रकार बनाया जा सकता है:
>>> import pandas as pd
>>> dFrameEmt = pd. DataFrame()
>>> dFrameEmt
खाली Dataframe
कॉलम: [ ]
अनुक्रमणिका: [ ]
सोचिए और विचार कीजिए
यदि हम उपरोक्त कोड में 4 के बजाय 3 कॉलम या 5 कॉलम पास करें तो क्या होगा? कारण क्या है?
(B) NumPy ndarrays से DataFrame का निर्माण
निम्नलिखित तीन NumPy ndarrays पर विचार करें। आइए बिना किसी कॉलम लेबल के, एक single ndarray का उपयोग करके एक सरल DataFrame बनाएँ:
>>> import numpy as np
>>> array1 = np.array([10,20,30])
>>> array2 = np.array([100,200,300])
>>> array3 = np.array([-10,-20,-30, -40])
>>> dFrame4 = pd.DataFrame(array1)
>>> dFrame4
0 1 2 |
0 10 20 30 |
हम एक से अधिक ndarrays का उपयोग करके DataFrame बना सकते हैं, जैसा कि निम्नलिखित उदाहरण में दिखाया गया है:
>>> dFrame5 = pd.DataFrame([array1, array3, array2], columns=[ ‘A’, ‘B’, ‘C’, ‘D’])
>>> dFrame5
0 1 2 |
A 10 -10 100 |
B 20 -20 200 |
C 30 -30 300 |
D NaN -40.0 NaN |
(C) शब्दकोशों की सूची से DataFrame का निर्माण
हम शब्दकोशों की सूची से DataFrame बना सकते हैं, उदाहरण के लिए:# Create list of dictionaries
# Create list of dictionaries
>>> listDict = [{‘a’:10, ‘b’:20}, {‘a’:5, ‘b’:10, ‘c’:20}]
>>> dFrameListDict = pd.DataFrame(listDict)
>>> dFrameListDict
0 1 |
a 10 5 |
b 20 10 |
c NaN 20.0 |
यहाँ, डिक्शनरी की कुंजियों को कॉलम लेबल माना जाता है, और प्रत्येक कुंजी से संबंधित मानों को पंक्तियों के रूप में लिया जाता है। जितनी डिक्शनरीज़ सूची में मौजूद होंगी, उतनी ही पंक्तियाँ होंगी। उपरोक्त उदाहरण में सूची में दो डिक्शनरीज़ हैं। इसलिए, डेटाफ्रेम में दो पंक्तियाँ हैं। डेटाफ्रेम में कॉलमों की संख्या सूची की किसी भी डिक्शनरी में मौजूद कुंजियों की अधिकतम संख्या के बराबर होती है। इसलिए, तीन कॉलम हैं क्योंकि दूसरी डिक्शनरी में तीन तत्व हैं। साथ ही, ध्यान दें कि यदि किसी कॉलम के लिए संगत मान गायब है तो NaN (Not a Number) डाला जाता है।
(D) डिक्शनरी ऑफ़ लिस्ट्स से डेटाफ्रेम का निर्माण
डेटाफ्रेम को लिस्ट्स की डिक्शनरी से भी बनाया जा सकता है। निम्नलिखित डिक्शनरी पर विचार करें जिसमें कुंजियाँ ‘State’, ‘GArea’ (भौगोलिक क्षेत्र) और ‘VDF’ (अत्यंत घना वन) हैं और संगत मान लिस्ट के रूप में हैं।
>>> dictForest = {‘State’: [‘Assam’, ‘Delhi’, ‘Kerala’],
$\quad$ ‘GArea’: [78438, 1483, 38852] ,
$\quad$ ‘VDF’ : [2797, 6.72,1663]}
>>> dFrameForest= pd.DataFrame(dictForest)
>>> dFrameForest
0 1 2 |
State Assam Delhi Kerala |
GArea 78438 1483 38852 |
VDF 2797.00 6.72 1663.00 |
ध्यान दें कि डिफ़ॉल्ट रूप से डेटाफ्रेम में डिक्शनरी की कुंजियाँ कॉलम लेबल बन जाती हैं और सूचियाँ पंक्तियाँ बन जाती हैं। इस प्रकार, डेटाफ्रेम को सूचियों के डिक्शनरी या श्रेणियों के डिक्शनरी के रूप में सोचा जा सकता है।
हम डेटाफ्रेम में कॉलमों का क्रम बदल सकते हैं। यह डिक्शनरी कुंजियों के किसी विशिष्ट क्रम को कॉलम पैरामीटर के रूप में निर्धारित करके किया जा सकता है, उदाहरण के लिए:
>>> dFrameForest1 = pd.DataFrame(dictForest, columns = [‘State’,‘VDF’, ‘GArea’])
>>> dFrameForest1
0 1 2 |
State असम दिल्ली केरल |
VDF 2797.00 6.72 1663.00 |
GArea 78438 1483 38852 |
आउटपुट में, VDF अब अंतिम के बजाय मध्य कॉलम के रूप में प्रदर्शित हो रहा है।
(E) श्रेणी से डेटाफ्रेम का निर्माण
निम्नलिखित तीन श्रेणियों पर विचार करें:
seriesA = pd.Series([1,2,3,4,5],
$\quad$ index = [‘a’, ‘b’, ‘c’, ’d’, ’e’])
seriesB = pd.Series ([1000,2000,-1000,-5000,1000],
$\quad$ index = [‘a’, ‘b’, ‘c’, ’d’, ’e’])
seriesC = pd.Series([10,20,-10,-50,100],
$\quad$ index = [‘z’, ‘y’, ‘a’, ‘c’, ’e’])
हम एक एकल श्रेणी का उपयोग करके डेटाफ्रेम बना सकते हैं जैसा नीचे दिखाया गया है:
>>> dFrame6 = pd.DataFrame(seriesA)
>>> dFrame6
a b c d e |
0 1 2 3 4 5 |
यहाँ, DataFrame dFrame6 में उतनी ही पंक्तियाँ हैं जितने कि series में तत्व हैं, लेकिन इसमें केवल एक स्तंभ है। एक से अधिक series का उपयोग करके DataFrame बनाने के लिए, हमें नीचे दिखाए अनुसार सूची में कई series पास करने होंगे:
>>> dFrame7 = pd.DataFrame([seriesA, seriesB])
>>> dFrame7
| a 0 1 |
b 1 1000 |
c 2 2000 |
d 3 -1000 |
e 4 -5000 |
5 1000 |
ध्यान दें कि series ऑब्जेक्ट में लेबल DataFrame ऑब्जेक्ट में स्तंभ नाम बन जाते हैं और प्रत्येक series DataFrame में एक पंक्ति बन जाती है। अब निम्नलिखित उदाहरण देखें:
>>> dFrame8 = pd.DataFrame([seriesA, seriesC])
>>> dFrame8
| a 0 1 |
b 1.0 -10.0 |
c 2.0 NaN |
d 3.0 -50.0 |
e 4.0 NaN |
z 5.0 100.0 |
y NaN 10.0 |
NaN 20.0 |
यहाँ, विभिन्न series में समान सेट के लेबल नहीं हैं। लेकिन, DataFrame में स्तंभों की संख्या सभी series में मौजूद विभिन्न लेबल के बराबर होती है। इसलिए, यदि कोई विशेष series किसी लेबल के लिए संगत मान नहीं रखता है, तो DataFrame स्तंभ में $\mathrm{NaN}$ डाला जाता है।
(F) Series के शब्दकोश से DataFrame का निर्माण
श्रृंखलाओं का एक डिक्शनरी भी DataFrame बनाने के लिए इस्तेमाल किया जा सकता है। उदाहरण के लिए, ResultSheet तीन विषयों में 5 विद्यार्थियों के अंकों को समेटे हुए श्रृंखलाओं का एक डिक्शनरी है। विद्यार्थियों के नाम डिक्शनरी की कुंजियाँ हैं और श्रृंखलाओं के इंडेक्स मान विषयों के नाम हैं, जैसा नीचे दिखाया गया है:
गतिविधि 2.7
type फ़ंक्शन का प्रयोग कर ResultSheet और ResultDF के डेटाटाइप जाँचिए। क्या ये एक समान हैं?
>>> ResultSheet={
‘Arnab’: pd.Series([90, 91, 97],
$\quad$ index=[‘Maths’,‘Science’,‘Hindi’]),
‘Ramit’: pd.Series([92, 81, 96],
$\quad$ index=[‘Maths’,‘Science’,‘Hindi’]),
‘Samridhi’: pd.Series([89, 91, 88],
$\quad$ index=[‘Maths’,‘Science’,‘Hindi’]),
‘Riya’: pd.Series([81, 71, 67],
$\quad$ index=[‘Maths’,‘Science’,‘Hindi’]),
‘Mallika’: pd.Series([94, 95, 99],
$\quad$ index=[‘Maths’,‘Science’,‘Hindi’])}
>>> ResultDF = pd.DataFrame(ResultSheet)
>>> ResultDF
| maths Science Hindi |
Arnab 90 91 97 |
Ramit 92 81 96 |
Samridhi 89 91 88 |
Riya 81 71 67 |
Mallika 94 95 99 |
निम्न आउटपुट दिखाता है कि DataFrame का प्रत्येक स्तंभ एक Series है:
>>> type(ResultDF.Arnab)
<class ‘pandas.core.series.Series’>
जब एक DataFrame Series के Dictionary से बनाया जाता है, तो परिणामी इंडेक्स या पंक्ति लेबल सभी Series इंडेक्स का यूनियन होता है जिनका उपयोग DataFrame बनाने के लिए किया गया है। उदाहरण के लिए:
dictForUnion = { ‘Series1’ :
pd.Series([1,2,3,4,5],
$\quad$ index = [‘a’, ‘b’, ‘c’, ’d’, ’e’]) ,
$\quad$ ‘Series2’ :
pd.Series([10,20,-10,-50,100],
$\quad$ index = [‘z’, ‘y’, ‘a’, ‘c’, ’e’]),
$\quad$ ‘Series3’ :
pd.Series([10,20,-10,-50,100],
$\quad$ index = [‘z’, ‘y’, ‘a’, ‘c’, ’e’]) }
>>> dFrameUnion = pd.DataFrame(dictForUnion)
>>> dFrameUnion
| a b c d e y z |
Series1 1.0 2.0 3.0 4.0 5.0 NaN NaN |
Series2 -10.0 NaN -50.0 NaN 100.0 20.0 10.0 |
Series3 -10.0 NaN -50.0 NaN 100.0 20.0 10.0 |
2.3.2 DataFrames में पंक्तियों और स्तंभों पर संचालन
हम DataFrame की पंक्तियों और स्तंभों पर कुछ बुनियादी संचालन कर सकते हैं जैसे चयन, विलोपन, जोड़ना और नाम बदलना, जैसा कि इस खंड में चर्चा की गई है।
(A) DataFrame में एक नया स्तंभ जोड़ना
हम एक DataFrame में आसानी से एक नया स्तंब जोड़ सकते हैं। आइए पहले परिभाषित किए गए DataFrame ResultDF पर विचार करें। एक अन्य छात्र ‘प्रीति’ के लिए एक नया स्तंभ जोड़ने के लिए, हम निम्नलिखित कथन लिख सकते हैं:
| गणित विज्ञान हिंदी |
अर्नब 90 91 97 |
रमित 92 81 96 |
समृद्धि 89 91 88 |
रिया 81 71 67 |
मल्लिका 94 95 99 |
प्रीति 89 78 76 |
किसी नए कॉलम लेबल को मान देने से, जो पहले से मौजूद नहीं है, अंत में एक नया कॉलम बन जाएगा। यदि कॉलम पहले से ही DataFrame में मौजूद है तो असाइनमेंट स्टेटमेंट पहले से मौजूद कॉलम के मानों को अपडेट कर देगा, उदाहरण के लिए:
>>> ResultDF[‘Ramit’]=[99, 98, 78]
>>> ResultDF
गणित विज्ञान हिंदी |
अर्नब 90 91 97 |
रमित 99 98 78 |
समृद्धि 89 91 88 |
रिया 81 71 67 |
मल्लिका 94 95 99 |
प्रीति 89 78 76 |
हम DataFrame में किसी पूरे कॉलम के डेटा को किसी विशेष मान पर भी सेट कर सकते हैं। उदाहरण के लिए, निम्नलिखित स्टेटमेंट ‘अर्नब’ नाम के कॉलम के लिए सभी विषयों में अंक $=90$ सेट करता है:
>>> ResultDF[‘Arnab’]=90
>>> ResultDF
गणित विज्ञान हिंदी |
अर्नब 90 90 90 |
रमित 99 98 78 |
समृद्धि 89 91 88 |
रिया 81 71 67 |
मल्लिका 94 95 99 |
प्रीति 89 78 76 |
(B) DataFrame में एक नई पंक्ति जोड़ना
हम DataFrame.loc[ ] विधि का उपयोग करके DataFrame में एक नई पंक्ति जोड़ सकते हैं। ResultDF नामक DataFrame पर विचार करें जिसमें तीन विषयों Maths, Science और Hindi के लिए तीन पंक्तियाँ हैं। मान लीजिए, हमें ResultDF में English विषय के अंक जोड़ने हैं, हम निम्नलिखित कथन का उपयोग कर सकते हैं:
>>> ResultDF
| Arnab | Ramit | Samridhi | Riya | Mallika | Preeti | |
| Maths | 90 | 92 | 89 | 81 | 94 | 89 |
| Science | 91 | 81 | 91 | 71 | 95 | 78 |
| Hindi | 97 | 96 | 88 | 67 | 99 | 76 |
>>> ResultDF.loc[‘English’] = [85, 86, 83, 80, 90, 89]
>>> ResultDF
| Arnab | Ramit | Samridhi | Riya | Mallika | Preeti | |
| Maths | 90 | 92 | 89 | 81 | 94 | 89 |
| Science | 91 | 81 | 91 | 71 | 95 | 78 |
| Hindi | 97 | 96 | 88 | 67 | 99 | 76 |
| English | 85 | 86 | 83 | 80 | 90 | 89 |
हम इस विधि का उपयोग पहले से मौजूद (डुप्लिकेट) सूचकांक मान (लेबल) के साथ डेटा की एक पंक्ति जोड़ने के लिए नहीं कर सकते। ऐसी स्थिति में, इस सूचकांक लेबल वाली पंक्ति अपडेट हो जाएगी, उदाहरण के लिए:
>>> ResultDF.loc[‘English’] = [95, 86, 95, 80, 95,99]
>>> ResultDF
| अर्नब | रमित | समृद्धि | रिया | मल्लिका | प्रीति | |
|---|---|---|---|---|---|---|
| गणित | 90 | 92 | 89 | 81 | 94 | 89 |
| विज्ञान | 91 | 81 | 91 | 71 | 95 | 78 |
| हिन्दी | 97 | 96 | 88 | 67 | 99 | 76 |
| अंग्रेज़ी | 95 | 86 | 95 | 80 | 95 | 99 |
DataFrame.loc[] विधि का उपयोग किसी पंक्ति के डेटा मानों को किसी विशेष मान पर सेट करने के लिए भी किया जा सकता है। उदाहरण के लिए, निम्नलिखित कथन सभी स्तंभों के लिए ‘गणित’ में अंक 0 पर सेट करता है:
>>> ResultDF.loc[‘गणित’]=0
>>> ResultDF
| अर्नब | रमित | समृद्धि | रिया | मल्लिका | प्रीति | |
|---|---|---|---|---|---|---|
| गणित | 0 | 0 | 0 | 0 | 0 | 0 |
| विज्ञान | 91 | 81 | 91 | 71 | 95 | 78 |
| हिन्दी | 97 | 96 | 88 | 67 | 99 | 76 |
| अंग्रेज़ी | 95 | 86 | 95 | 80 | 95 | 99 |
सोचिए और विचार कीजिए
क्या आप DataFrame में पंक्तियों और स्तंभों की संख्या गिनने के लिए एक प्रोग्राम लिख सकते हैं?
यदि हम DataFrame में ऐसी पंक्ति जोड़ने का प्रयास करते हैं जिसमें मानों की संख्या DataFrame के स्तंभों की संख्या से कम हो, तो इससे ValueError आती है, त्रुटि संदेश के साथ: ValueError: Cannot set a row with mismatched columns.
इसी प्रकार, यदि हम DataFrame में ऐसा स्तंभ जोड़ने का प्रयास करते हैं जिसमें मानों की संख्या DataFrame की पंक्तियों की संख्या से कम हो, तो इससे ValueError आती है, त्रुटि संदेश के साथ: ValueError: Length of values does not match length of index.
आगे, हम DataFrame के सभी मानों को किसी विशेष मान पर सेट कर सकते हैं, उदाहरण के लिए:
>>> ResultDF[: ] = 0 # ResultDF में सभी मान 0 पर सेट करें
>>> ResultDF
| अर्नब | रमित | समृद्धि | रिया | मल्लिका | प्रीति | |
|---|---|---|---|---|---|---|
| गणित | 0 | 0 | 0 | 0 | 0 | 0 |
| विज्ञान | 0 | 0 | 0 | 0 | 0 | 0 |
| हिंदी | 0 | 0 | 0 | 0 | 0 | 0 |
| अंग्रेज़ी | 0 | 0 | 0 | 0 | 0 | 0 |
(C) DataFrame से पंक्तियाँ या स्तंभ हटाना
हम DataFrame.drop() विधि का उपयोग करके DataFrame से पंक्तियाँ और स्तंभ हटा सकते हैं। हमें हटाए जाने वाले लेबलों के नाम और वह अक्ष (axis) निर्दिष्ट करना होता है जिससे उन्हें हटाना है। पंक्ति हटाने के लिए पैरामीटर axis को मान 0 दिया जाता है और स्तंभ हटाने के लिए पैरामीटर axis को मान 1 दिया जाता है। निम्नलिखित DataFrame पर विचार करें:
>>> ResultDF
| अर्नब | रमित | समृद्धि | रिया | मल्लिका | |
|---|---|---|---|---|---|
| गणित | 90 | 92 | 89 | 81 | 94 |
| विज्ञान | 91 | 81 | 91 | 71 | 95 |
| हिंदी | 97 | 96 | 88 | 67 | 99 |
| अंग्रेज़ी | 95 | 86 | 95 | 80 | 95 |
निम्नलिखित उदाहरण दिखाता है कि लेबल ‘विज्ञान’ वाली पंक्ति को कैसे हटाया जाता है:
>>> ResultDF = ResultDF.drop(‘विज्ञान’, axis=0)
>>> ResultDF
| अर्नब | रमित | समृद्धि | रिया | मल्लिका | |
|---|---|---|---|---|---|
| गणित | 90 | 92 | 89 | 81 | 94 |
| हिंदी | 97 | 96 | 88 | 67 | 99 |
| अंग्रेज़ी | 95 | 86 | 95 | 80 | 95 |
निम्नलिखित उदाहरण दिखाता है कि लेबल ‘समृद्धि’, ‘रमित’ और ‘रिया’ वाले स्तंभों को कैसे हटाया जाता है:
>>> ResultDF = ResultDF.drop([‘समृद्धि’,‘रमित’,‘रिया’], axis=1)
>>> ResultDF
| अर्नब | मल्लिका | |
|---|---|---|
| गणित | 90 | 94 |
| हिन्दी | 97 | 99 |
| अंग्रेज़ी | 95 | 95 |
यदि DataFrame में एक से अधिक पंक्तियाँ समान लेबल के साथ हों, तो DataFrame.drop() विधि उनमें से सभी मिलान वाली पंक्तियों को हटा देगी। उदाहरण के लिए, निम्न DataFrame पर विचार करें:
गणित विज्ञान हिन्दी हिन्दी |
अर्नब 90 91 97 97 |
रमित 92 81 96 89 |
समृद्धि 89 91 88 78 |
रिया 81 71 67 60 |
मल्लिका 94 95 99 45 |
‘हिन्दी’ लेबल वाली दोहराई गई पंक्तियों को हटाने के लिए हमें निम्न कथन लिखना होगा:
सोचिए और विचार कीजिए
यदि rename फ़ंक्शन में हम ऐसा पंक्ति लेबल दें जो मौजूद ही न हो, तो क्या होगा?
>>> ResultDF= ResultDF.drop(‘हिन्दी’, axis=0)
>>> ResultDF
| अर्नब | रमित | समृद्धि | रिया | मल्लिका | |
|---|---|---|---|---|---|
| गणित | 90 | 92 | 89 | 81 | 94 |
| विज्ञान | 91 | 81 | 91 | 71 | 95 |
(D) DataFrame के पंक्ति लेबलों का नाम बदलना
हम DataFrame.rename() विधि का उपयोग करके DataFrame की पंक्तियों और स्तंभों के लेबल बदल सकते हैं। निम्न DataFrame पर विचार करें। पंक्ति सूचकांकों का नाम गणित को sub1, विज्ञान को sub2, हिन्दी को sub3 और अंग्रेज़ी को sub4 करने के लिए हम निम्न कथन लिख सकते हैं:
>>> ResultDF
| अर्नब | रमित | समृद्धि | रिया | मल्लिका | |
| गणित | 90 | 92 | 89 | 81 | 94 |
| विज्ञान | 91 | 81 | 91 | 71 | 95 |
| अंग्रेज़ी | 97 | 96 | 88 | 67 | 99 |
| हिन्दी | 97 | 89 | 78 | 60 | 45 |
>>> ResultDF=ResultDF.rename({‘Maths’:‘Sub1’, ‘Science’:‘Sub2’,‘English’:‘Sub3’, ‘Hindi’:‘Sub4’}, axis=‘index’)
>>> print(ResultDF)
| अर्नब | रमित | समृद्धि | रिया | मल्लिका | |
|---|---|---|---|---|---|
| Sub1 | 90 | 92 | 89 | 81 | 94 |
| Sub2 | 91 | 81 | 91 | 71 | 95 |
| Sub3 | 97 | 96 | 88 | 67 | 99 |
| Sub4 | 97 | 89 | 78 | 60 | 45 |
पैरामीटर axis=‘index’ यह निर्दिष्ट करने के लिए प्रयोग किया जाता है कि पंक्ति लेबल को बदलना है। यदि किसी मौजूदा लेबल के अनुरूप कोई नया लेबल पास नहीं किया जाता है, तो मौजूदा पंक्ति लेबल वैसा ही रहता है, उदाहरण के लिए:
>>> ResultDF=ResultDF.rename({‘Maths’:‘Sub1’,‘Science’:‘Sub2’,‘Hindi’:‘Sub4’}, axis=‘index’) >>> print(ResultDF)
Sub1 Sub2 English Sub |
अर्नब 90 91 97 97 |
रमित 92 81 96 89 |
समृद्धि 89 91 88 78 |
रिया 81 71 67 60 |
मल्लिका 94 95 99 45 |
(E) डेटाफ्रेम के स्तंभ लेबल का नाम बदलना
ResultDF के कॉलम नाम बदलने के लिए हम फिर से rename() मेथड का उपयोग कर सकते हैं, जैसा नीचे दिखाया गया है। पैरामीटर axis=‘columns’ इस बात को दर्शाता है कि हम कॉलम लेबल बदलना चाहते हैं:
>>>ResultDF=ResultDF.rename({‘Arnab’:‘Student1’,‘Ramit’:‘Student2’,‘Samridhi’:‘Student3’,
‘Mallika’:‘Student4’},axis=‘columns’)
>>> print(RsultDF)
| Student1 | Student2 | Student3 | Riya | Student4 | |
|---|---|---|---|---|---|
| Maths | 90 | 92 | 89 | 81 | 94 |
| Science | 91 | 81 | 91 | 71 | 95 |
| English | 97 | 96 | 88 | 67 | 99 |
| Hindi | 97 | 89 | 78 | 60 | 45 |
ध्यान दें कि Riya कॉलम अपरिवर्तित रहता है क्योंकि हमने उसके लिए कोई नया लेबल नहीं दिया।
2.3.3 इंडेक्सिंग के माध्यम से डेटाफ्रेम के तत्वों तक पहुँच
डेटाफ्रेम में डेटा तत्वों तक इंडेक्सिंग का उपयोग करके पहुँचा जा सकता है। डेटाफ्रेम को इंडेक्स करने के दो तरीके हैं: लेबल आधारित इंडेक्सिंग और बूलियन इंडेक्सिंग।
सोचिए और विचार कीजिए
यदि डेटाफ्रेम में दिया गया लेबल या पंक्ति इंडेक्स मौजूद नहीं है तो क्या होगा?
(A) लेबल आधारित इंडेक्सिंग
पांडास में लेबल आधारित इंडेक्सिंग लागू करने के कई तरीके हैं। DataFrame.loc[ ] एक महत्वपूर्ण मेथड है जो डेटाफ्रेम के साथ लेबल आधारित इंडेक्सिंग के लिए उपयोग किया जाता है। आइए पहले बनाए गए ResultDF का उपयोग जारी रखें। निम्न उदाहरण में दिखाया गया है कि एक एकल पंक्ति लेबल पंक्ति को एक सीरीज़ के रूप में लौटाता है।
>>> ResultDF
| गणित | अर्नब | रमित | समृद्धि | रिया | मल्लिका | |
| विज्ञान | 90 | 92 | 89 | 81 | 94 | |
| हिन्दी | 91 | 81 | 91 | 71 | 95 |
>>> ResultDF.loc[‘Science’]
| अर्नब | 91 |
| रमित | 81 |
| समृद्धि | 91 |
| रिया | 71 |
| मल्लिका | 95 |
नाम: Science, dtype: int64
यह भी ध्यान दें कि जब पंक्ति लेबल पूर्णांक मान के रूप में दिया जाता है, तो इसे सूचकांक की स्थिति के बजाय सूचकांक का लेबल माना जाता है, उदाहरण के लिए:
>>> dFrame10Multiples = pd.DataFrame([10,20,30,40,50])
>>> dFrame10Multiples.loc[2]
0 $\quad $ 30
नाम: 2, dtype: int64
जब एकल स्तंभ लेबल दिया जाता है, तो यह स्तंभ को एक Series के रूप में लौटाता है।
>>> ResultDF.loc[:,‘Arnab’]
गणित $\quad$ 90
विज्ञान $\quad$ 91
हिन्दी $\quad$ 97
नाम: अर्नब, dtype: int64
इसके अतिरिक्त, हम वही परिणाम प्राप्त कर सकते हैं अर्थात् सभी विषयों में ‘अर्नब’ के अंक निम्नलिखित कमांड का उपयोग करके:
>>> print(df[‘Arnab’])
गणित $\quad$ 56
विज्ञान $\quad$ 91
अंग्रेज़ी$\quad$ 97
हिन्दी $\quad$ 97
नाम: अर्नब, dtype: int64
DataFrame से एक से अधिक पंक्तियाँ पढ़ने के लिए, नीचे दिखाए अनुसार पंक्ति लेबलों की एक सूची का उपयोग किया जाता है। ध्यान दें कि [[]] का उपयोग करने से एक DataFrame लौटता है।
>>> ResultDF.loc[[‘Science’, ‘Hindi’]]
| अर्नब | रमित | समृद्धि | रिया | मल्लिका | |
|---|---|---|---|---|---|
| विज्ञान | 91 | 81 | 91 | 71 | 95 |
| हिन्दी | 97 | 96 | 88 | 67 | 99 |
(B) बूलियन अनुक्रमण
बूलियन का अर्थ है एक द्विआधारी चर जो दो अवस्थाओं में से किसी एक को दर्शा सकता है - सत्य (1 से संकेतित) या असत्य (0 से संकेतित)। बूलियन अनुक्रमण में हम डेटा के उपसमुच्चय का चयन डेटाफ्रेम में मौजूद वास्तविक मानों के आधार पर कर सकते हैं, न कि उनके पंक्ति/स्तंभ लेबल के आधार पर। इस प्रकार हम डेटा मानों को फिल्टर करने के लिए स्तंभ नामों पर शर्तों का उपयोग कर सकते हैं। DataFrame ResultDF पर विचार करें, निम्न कथन सत्य या असत्य प्रदर्शित करता है यह देखते हुए कि डेटा मान दी गई शर्त को संतुष्ट करता है या नहीं।
>>> ResultDF.loc[‘Maths’] > 90
Arnab $\quad$ False
Ramit $\quad$ True
Samridhi $\quad$ False
Riya $\quad$ False
Mallika $\quad$ True
Name: Maths, dtype: bool
यह जांचने के लिए कि ‘Arnab’ ने किन विषयों में 90 से अधिक अंक प्राप्त किए हैं, हम लिख सकते हैं:
>>> ResultDF.loc[:,‘Arnab’]>90
Maths $\quad$ False
Science $\quad$ True
Hindi $\quad$ True
Name: Arnab, dtype: bool
2.3.4 स्लाइसिंग के माध्यम से डेटाफ्रेम तत्वों तक पहुँचना
हम डेटाफ्रेम से पंक्तियों और/या स्तंभों के उपसमुच्चय का चयन करने के लिए स्लाइसिंग का उपयोग कर सकते हैं। पंक्तियों के एक समूह को पुनः प्राप्त करने के लिए, स्लाइसिंग का उपयोग पंक्ति लेबलों के साथ किया जा सकता है। उदाहरण के लिए:
>>> ResultDF.loc[‘Maths’: ‘Science’]
| Arnab | Ramit | Samridhi | Riya | Mallika | |
|---|---|---|---|---|---|
| Maths | 90 | 92 | 89 | 81 | 94 |
| Science | 91 | 81 | 91 | 71 | 95 |
गतिविधि 2.8
क) DataFrame ResultDF का उपयोग करते हुए, Arnab के Maths में अंकों तक पहुँचने के लिए कथन लिखें।
ख) 5 पंक्तियों वाला एक DataFrame बनाएँ और उसकी पहली 4 पंक्तियाँ प्राप्त करने के लिए कथन लिखें।
यहाँ, Maths और Science लेबल वाली पंक्तियाँ प्रदर्शित की गई हैं। ध्यान दें कि DataFrames में स्लाइसिंग अंतिम मानों को सम्मिलित करती है। हम किसी स्तंभ के नाम के साथ लेबलों की एक स्लाइस का उपयोग करके केवल उन पंक्तियों के मान उस स्तंभ में प्राप्त कर सकते हैं। उदाहरण के लिए, निम्नलिखित कथन Maths और Science लेबल वाली पंक्तियाँ और Arnab लेबल वाला स्तंभ प्रदर्शित करता है:
>>> ResultDF.loc[‘Maths’: ‘Science’, ‘Arnab’]
Maths $\quad$ 90
Science $\quad$ 91
Name: Arnab, dtype: int64
हम लेबलों की एक स्लाइस का उपयोग स्तंभ नामों की एक स्लाइस के साथ करके उन पंक्तियों और स्तंभों के मान प्राप्त कर सकते हैं:
>>> ResultDF.loc[‘Maths’: ‘Science’, ‘Arnab’:’Samridhi’]
| Arnab | Ramit | Samridhi | |
|---|---|---|---|
| Maths | 90 | 92 | 89 |
| Science | 91 | 81 | 91 |
वैकल्पिक रूप से, हम लेबलों की एक स्लाइस का उपयोग स्तंभ नामों की एक सूची के साथ करके उन पंक्तियों और स्तंभों के मान प्राप्त कर सकते हैं:
>>> ResultDF.loc[‘Maths’: ‘Science’,[‘Arnab’,’Samridhi’]]
| Arnab | Samridhi | |
|---|---|---|
| Maths | 90 | 89 |
| Science | 91 | 91 |
DataFrames में पंक्तियाँ फ़िल्टर करना
DataFrames में, बूलियन मान True (1) और False (0) को सूचकांकों से जोड़ा जा सकता है। वे DataFrmae.loc[] विधि का उपयोग करके रिकॉर्ड फ़िल्टर करने के लिए भी उपयोग किए जा सकते हैं।
विशेष पंक्ति(यों) को चुनने या छोड़ने के लिए, हम एक बूलियन सूची का उपयोग कर सकते हैं जिसमें आउटपुट में दिखाई देने वाली पंक्तियों के लिए ‘True’ और छोड़ी जाने वाली पंक्तियों के लिए ‘False’ निर्दिष्ट किया जाता है। उदाहरण के लिए, निम्नलिखित कथन में, जिस पंक्ति का सूचकांक Science है, उसे छोड़ दिया गया है:
>>> ResultDF.loc[[True, False, True]]
| Arnab | Ramit | Samridhi | Riya | Mallika | |
|---|---|---|---|---|---|
| Maths | 90 | 92 | 89 | 81 | 94 |
| Hindi | 97 | 96 | 88 | 67 | 99 |
2.3.5 DataFrames को जोड़ना, मर्ज करना और कंकटेनेशन
(A) जोड़ना
हम दो DataFrames को मर्ज करने के लिए pandas.DataFrame.append() विधि का उपयोग कर सकते हैं। यह दूसरे DataFrame की पंक्तियों को पहले DataFrame के अंत में जोड़ता है। वे कॉलम जो पहले DataFrame में मौजूद नहीं हैं, नए कॉलम के रूप में जोड़े जाते हैं। उदाहरण के लिए, नीचे वर्णित दो DataFrames dFrame1 और dFrame2 पर विचार करें। आइए dFrame2 को dFrame1 में जोड़ने के लिए append() विधि का उपयोग करें:
>>> dFrame1=pd.DataFrame([[1, 2, 3], [4, 5], [6]], columns=[‘C1’, ‘C2’, ‘C3’], index=[‘R1’, ‘R2’, ‘R3’])
>>> dFrame1
| C1 | C2 | C3 | |
|---|---|---|---|
| R1 | 1 | 2.0 | 3.0 |
| R2 | 4 | 5.0 | NaN |
| R3 | 6 | NaN | NaN |
>>> dFrame2=pd.DataFrame([[10, 20], [30], [40, 50]], columns=[‘C2’, ‘C5’], index=[‘R4’, ‘R2’, ‘R5’])
>>> dFrame2
| C2 | C3 | |
|---|---|---|
| R4 | 10 | 20.0 |
| R2 | 30 | NaN |
| R5 | 40 | 50.0 |
>>> dFrame1=dFrame1.append(dFrame2)
>>> dFrame1
| C1 | C2 | C3 | C5 | |
|---|---|---|---|---|
| R1 | 1.1 | 2.0 | 3.0 | NaN |
| R2 | 4.0 | 5.0 | NaN | NaN |
| R3 | 6.0 | NaN | NaN | NaN |
| R4 | NaN | 10.0 | NaN | 20.0 |
| R2 | NaN | 30.0 | NaN | NaN |
| R5 | NaN | 40.0 | NaN | 50.0 |
वैकल्पिक रूप से, यदि हम dFrame1 को dFrame2 में जोड़ते हैं, तो dFrame2 की पंक्तियाँ dFrame1 की पंक्तियों से पहले आती हैं। कॉलम लेबल्स को क्रमबद्ध (sorted) क्रम में दिखाने के लिए हम पैरामीटर sort=True सेट कर सकते हैं। जब पैरामीटर sort=False होता है, तो कॉलम लेबल्स अक्रमबद्ध (unsorted) क्रम में दिखाई देंगे।
# dFrame1 को dFrame2 में जोड़ना
>>> dFrame2 = dFrame2.append(dFrame1, sort=‘True’)
>>> dFrame2
| C1 | C2 | C3 | C5 | |
|---|---|---|---|---|
| R4 | NaN | 10.0 | NaN | 20.0 |
| R2 | NaN | 30.0 | NaN | NaN |
| R5 | NaN | 40.0 | NaN | 50.0 |
| R1 | 1.0 | 2.0 | 3.0 | NaN |
| R2 | 4.0 | 5.0 | NaN | NaN |
| R3 | 6.0 | NaN | NaN | NaN |
# dFrame1 को dFrame2 में sort=False के साथ जोड़ना
>>> dFrame2 = dFrame2.append(dFrame1, sort=‘False’)
>>> dFrame2
| C1 | C5 | C1 | C3 | |
|---|---|---|---|---|
| R4 | 10.0 | 20.0 | NaN | 20.0 |
| R2 | 30.0 | NaN | NaN | NaN |
| R5 | 40.0 | 50.0 | NaN | NaN |
| R1 | 2.0 | NaN | 1.0 | 3.0 |
| R2 | 5.0 | NaN | 4.0 | NaN |
| R3 | NaN | NaN | 6.0 | NaN |
append() विधि के verify_integrity पैरामीटर को True पर सेट किया जा सकता है जब हम चाहते हैं कि यदि पंक्ति लेबल डुप्लिकेट हों तो त्रुटि उत्पन्न हो। डिफ़ॉल्ट रूप से, verify_integrity $=$ False। इसीलिए हम दो DataFrames को जोड़ते समय R2 लेबल वाली डुप्लिकेट पंक्ति को जोड़ सके, जैसा ऊपर दिखाया गया है।
सोचिए और विचार कीजिए
आप कैसे जांच सकते हैं कि किसी दिए गए DataFrame में कोई मान गायब है या नहीं?
append() विधि के ignore_index पैरामीटर को True पर सेट किया जा सकता है, जब हम पंक्ति सूचकांक लेबल का उपयोग नहीं करना चाहते। डिफ़ॉल्ट रूप से, ignore_index = False।
>>> dFrame1 = dFrame1.append(dFrame2, ignore_index=True)
>>> dFrame1
| C1 | C2 | C3 | C5 | |
|---|---|---|---|---|
| 0 | 1.0 | 2.0 | 3.0 | NaN |
| 1 | 4.0 | 5.0 | NaN | NaN |
| 2 | 6.0 | NaN | NaN | NaN |
| 3 | NaN | 10.0 | NaN | 20.0 |
| 4 | NaN | 30.0 | NaN | NaN |
| 5 | NaN | 40.0 | NaN | 50.0 |
append() विधि का उपयोग एक श्रेणी या शब्दकोश को DataFrame में जोड़ने के लिए भी किया जा सकता है।
2.3.6 DataFrames के गुणधर्म
Series की तरह, हम DataFrame के कुछ गुणधर्मों को DataFrame के नाम के साथ उस गुणधर्म का उपयोग करके एक्सेस कर सकते हैं। तालिका 2.4 कुछ Pandas DataFrame के गुणधर्मों की सूची देती है। हम इस खंड में उदाहरण डेटा के रूप में “STATE OF FOREST REPORT 2017” नामक रिपोर्ट के एक भाग का उपयोग करने जा रहे हैं, जो Forest Survey of India द्वारा प्रकाशित है और http://fsi.nic.in/forest-report-2017 पर सुलभ है।
इस रिपोर्ट के अनुसार, भौगोलिक क्षेत्र, अत्यंत घने वनों का क्षेत्र, मध्यम घने वनों का क्षेत्र और खुले वनों का क्षेत्र (सभी वर्ग किमी में), भारत के तीन राज्यों - असम, दिल्ली और केरल में निम्नलिखित डेटाफ्रेम ForestAreaDF में दिखाए गए हैं:
>>> ForestArea = {
$\quad$‘Assam’ :pd.Series([78438, 2797,
10192, 15116], index = [‘GeoArea’, ‘VeryDense’,
ModeratelyDense’, ‘OpenForest’]),
$\quad$‘Kerala’ :pd.Series([ 38852, 1663,
9407, 9251], index = [‘GeoArea’ ,‘VeryDense’,
‘ModeratelyDense’, ‘OpenForest’]),
$\quad$ ‘Delhi’ :pd.Series([1483, 6.72, 56.24,
129.45], index = [‘GeoArea’, ‘VeryDense’,
‘$\quad$ModeratelyDense’, ‘OpenForest’])}
>>> ForestAreaDF = pd.DataFrame(ForestArea)
>>> ForestAreaDF
| Assam | Kerala | Delhi | |
|---|---|---|---|
| GeoArea | 78438 | 38852 | 1483.00 |
| VeryDense | 2797 | 1663 | 6.72 |
| ModeratelyDense | 10192 | 9407 | 56.24 |
| OpenForest | 15116 | 9251 | 129.45 |
तालिका 2.4 पांडास डेटाफ्रेम के कुछ गुण
| विशेषता नाम | उद्देश्य | उदाहरण |
|---|---|---|
| DataFrame.index | पंक्ति लेबल प्रदर्शित करने के लिए | »> ForestAreaDF.index Index([‘GeoArea’, ‘VeryDense’, ‘ModeratelyDense’, ‘OpenForest’], dtype =’object’) |
| DataFrame.columns | स्तंभ लेबल प्रदर्शित करने के लिए | »> ForestAreaDF.columns Index([‘Assam’, ‘Kerala’, ‘Delhi’], dtype=’object’) |
| DataFrame.dtypes | DataFrame में प्रत्येक स्तंभ के डेटा प्रकार को प्रदर्शित करने के लिए | >>> ForestAreaDF.dtypes Assam $\quad$ int64 Kerala $\quad$ int64 Delhi $\quad$ float64 dtype: object |
| DataFrame.values | DataFrame में सभी मानों वाला NumPy ndarray प्रदर्शित करने के लिए, बिना अक्ष लेबल के | >>> ForestAreaDF.values array([[7.8438e+04, 3.8852e+04, 1.4830e+03], $\qquad$ [2.7970e+03, 1.6630e+03, 6.7200e+00], $\qquad$ [1.0192e+04, 9.4070e+03, 5.6240e+01], $\qquad$ [1.5116e+04, 9.2510e+03, 1.2945e+02]]) |
| DataFrame.shape | DataFrame की विमाओं को दर्शाने वाला tuple प्रदर्शित करने के लिए | >>>ForestAreaDF.shape(4, 3) इसका अर्थ है ForestAreaDF में 4 पंक्तियाँ और 3 स्तंभ हैं। |
| DataFrame.size | DataFrame की विमाओं को दर्शाने वाला tuple प्रदर्शित करने के लिए | >>> ForestAreaDF.size12 इसका अर्थ है ForestAreaDF में 12 मान हैं। |
| DataFrame.T | DataFrame को ट्रांसपोज़ करने के लिए। इसका अर्थ है, DataFrame की पंक्ति सूचकांक और स्तंभ लेबल एक-दूसरे की स्थिति ले लेते हैं | >>> ForestAreaDF.T ![]() |
| DataFrame.head(n) | DataFrame में पहली n पंक्तियाँ प्रदर्शित करने के लिए | >>> ForestAreaDF.head(2) DataFrame ForestAreaDF की पहली 2 पंक्तियाँ प्रदर्शित करता है। यदि पैरामीटर n निर्दिष्ट नहीं किया जाता है तो डिफ़ॉल्ट रूप से यह DataFrame की पहली 5 पंक्तियाँ देता है। |
| DataFrame.tail(n) | DataFrame में अंतिम n पंक्तियाँ प्रदर्शित करने के लिए | >>> ForestAreaDF.tail(2) DataFrame ForestAreaDF की अंतिम 2 पंक्तियाँ प्रदर्शित करता है। यदि पैरामीटर n निर्दिष्ट नहीं किया जाता है तो डिफ़ॉल्ट रूप से यह DataFrame की अंतिम 5 पंक्तियाँ देता है। |
| यदि DataFrame खाली है तो True और अन्यथा False लौटाता है | >>> ForestAreaDF.empty False >>> df=pd.DataFrame() #एक खाली dataFrame बनाएँ >>> df.empty True |
2.4 CSV फ़ाइलों और डेटाफ्रेम के बीच डेटा आयात और निर्यात
हम कॉमा से अलग किए गए मानों वाली CSV फ़ाइलों से डेटा आयात करके एक डेटाफ्रेम बना सकते हैं। इसी तरह, हम डेटाफ्रेम में मौजूद डेटा को .csv फ़ाइल के रूप में संग्रहित या निर्यात भी कर सकते हैं।
2.4.1 CSV फ़ाइल को डेटाफ्रेम में आयात करना
मान लीजिए कि हमारे पास निम्नलिखित डेटा ResultData.csv नामक csv फ़ाइल में है, जो C:/NCERT फ़ोल्डर में संग्रहित है। जैसे-जैसे हम आगे बढ़ें, आपसे अनुरोध है कि आप इस csv फ़ाइल को किसी स्प्रेडशीट का उपयोग करके बनाएँ और अपने कंप्यूटर में सहेजें।
| Roll No | Name | Eco | Maths |
|---|---|---|---|
| 1 | Arnab | 18 | 57 |
| 2 | Kritika | 23 | 45 |
| 3 | Divyam | 51 | 37 |
| 4 | Vivaan | 40 | 60 |
| 5 | Aaroosh | 18 | 27 |
हम ResultData.csv फ़ाइल से डेटा को पांडास के read_csv() फ़ंक्शन का उपयोग करके marks नामक डेटाफ्रेम में लोड कर सकते हैं, जैसा कि नीचे दिखाया गया है:
>>> marks = pd.read_csv(“C:/NCERT/ResultData.csv”,sep =",", header=0)
>>> marks
| Roll No | Name | Eco | Maths | |
|---|---|---|---|---|
| 0 | 1 | Arnab | 18 | 57 |
| 1 | 2 | Kritika | 23 | 45 |
| 2 | 3 | Divyam | 51 | 37 |
| 3 | 4 | Vivaan | 40 | 60 |
| 4 | 5 | Aaroosh | 18 | 27 |
- read_csv() का पहला पैरामीटर कॉमा सेपरेटेड डेटा फ़ाइल का नाम और उसका पाथ होता है।
- sep पैरामीटर बताता है कि मान कॉमा, सेमीकोलन, टैब या किसी अन्य कैरेक्टर से अलग हैं। sep का डिफ़ॉल्ट मान स्पेस होता है।
- header पैरामीटर उस रो की संख्या निर्दिष्ट करता है जिसके मान कॉलम नामों के रूप में इस्तेमाल होंगे। यह डेटा लाने की शुरुआत को भी चिह्नित करता है। header $=0$ का अर्थ है कि कॉलम नाम फ़ाइल की पहली लाइन से लिए जाते हैं। डिफ़ॉल्ट रूप से, header $=0$ होता है।
हम read_csv() फंक्शन का उपयोग करके DataFrame बनाते समय names पैरामीटर का उपयोग करके विशेष रूप से कॉलम नाम निर्दिष्ट कर सकते हैं। उदाहरण के लिए, निम्नलिखित कथन में names पैरामीटर का उपयोग DataFrame marks1 के कॉलमों के लिए लेबल निर्दिष्ट करने के लिए किया गया है:
>>> marks1 = pd.read_csv(“C:/NCERT/ResultData1.
csv”,sep=",",
names=[‘RNo’,‘StudentName’, ‘Sub1’, ‘Sub2’])
>>> marks1
| Roll No | StudentName | Sub1 | Sub2 | |
|---|---|---|---|---|
| 0 | 1 | Arnab | 18 | 57 |
| 1 | 2 | Kritika | 23 | 45 |
| 2 | 3 | Divyam | 51 | 37 |
| 3 | 4 | Vivaan | 40 | 60 |
| 4 | 5 | Aaroosh | 18 | 27 |
2.4.2 DataFrame को CSV फ़ाइल में एक्सपोर्ट करना
हम किसी DataFrame को टेक्स्ट या csv फ़ाइल में सेव करने के लिए to_csv() फंक्शन का उपयोग कर सकते हैं। उदाहरण के लिए, पिछले भाग में बनाए गए DataFrame ResultDF को सेव करने के लिए हम निम्नलिखित कथन का उपयोग कर सकते हैं:[^1]
| अर्नब | रमित | समृद्धि | रिया | मल्लिका | |
|---|---|---|---|---|---|
| गणित | 90 | 92 | 89 | 81 | 94 |
| विज्ञान | 91 | 81 | 91 | 71 | 95 |
| हिन्दी | 97 | 96 | 88 | 67 | 99 |
>>> ResultDF.to_csv(path_or_buf=‘c:/NCERT/ resultout. csv’, sep $=$ ‘, ‘)
कॉमा-सेपरेटेड वैल्यू (CSV) फ़ाइल एक टेक्स्ट फ़ाइल होती है जिसमें मान कॉमा से अलग होते हैं। प्रत्येक पंक्ति एक रिकॉर्ड (पंक्ति) को दर्शाती है। प्रत्येक पंक्ति में एक या अधिक फ़ील्ड (स्तंभ) होते हैं। इन्हें स्प्रेडशीट एप्लिकेशन के माध्यम से आसानी से संभाला जा सकता है
यह हार्ड डिस्क पर C:/NCERT फ़ोल्डर में resultout.csv नाम की फ़ाइल बनाता है। जब हम इस फ़ाइल को किसी टेक्स्ट एडिटर या स्प्रेडशीट में खोलते हैं, तो हमें उपरोक्त डेटा के साथ-साथ पंक्ति लेबल और स्तंभ हेडर कॉमा से अलग मिलेंगे।
यदि हम नहीं चाहते कि स्तंभ नाम फ़ाइल में सहेजे जाएं तो हम पैरामीटर header=False का उपयोग कर सकते हैं। एक अन्य पैरामीटर index=False का उपयोग तब किया जाता है जब हम नहीं चाहते कि पंक्ति लेबल डिस्क पर फ़ाइल में लिखे जाएं। उदाहरण के लिए:
सोचिए और विचार कीजिए
read_csv() फंक्शन के साथ कौन-से अन्य पैरामीटर उपयोग किए जा सकते हैं? आप https://pandas.pydata.org से खोज सकते हैं।
>>> ResultDF.to_CSv( ‘C:/NCERT/resultonly.txt’, sep = ’ @’, header = False, index= Falsel
यदि हम फ़ाइल resultonly.txt खोलते हैं, तो हमें निम्नलिखित सामग्री मिलेगी:
$90 @ 92 @ 89 @ 81 @ 94$
$91 @ 81 @ 91 @ 71 @ 95$
$97 @ 96 @88 @67@99$
सोचिए और विचार कीजिए
कॉमा के अलावा, कौन-से अन्य वैध वर्ण हैं जिन्हें DataFrame से CSV फ़ाइल बनाते समय विभाजक (separator) के रूप में इस्तेमाल किया जा सकता है?
2.5 Pandas Series बनाम NumPy ndarray
Pandas अद्वितीय नहीं (non-unique) इंडेक्स मानों को भी समर्थन देता है। यदि कोई ऐसा संचालन किया जाता है जो दोहराए गए इंडेक्स मानों को समर्थन नहीं देता, तो उस समय एक अपवाद (exception) उत्पन्न होगा।
Series और ndarray के बीच एक मूलभूत अंतर यह है कि Series के बीच संचालन स्वचालित रूप से लेबल के आधार पर डेटा को संरेखित (align) कर देते हैं। इस प्रकार, हम गणनाएँ लिख सकते हैं बिना यह सोचे कि सभी Series में समान लेबल हैं या नहीं।
असंरेखित Series (जिनमें संगत लेबल समान नहीं हैं या समान क्रम में नहीं हैं) के बीच संचालन का परिणाम उन सभी इंडेक्स का यूनियन होगा। यदि कोई लेबल किसी एक Series में नहीं मिलता, तो परिणाम में उसे लापता NaN के रूप में चिह्नित किया जाएगा। बिना किसी स्पष्ट डेटा संरेखण के कोड लिख पाने की क्षमता इंटरैक्टिव डेटा विश्लेषण और अनुसंधान में अपार स्वतंत्रता और लचीलापन प्रदान करती है।
तालिका 2.5 Pandas Series और NumPy Arrays के बीच अंतर
| Pandas Series | NumPy Arrays |
|---|---|
| सीरीज़ में हम सरण के अवयवों तक पहुँचने के लिए अपना खुद का लेबल वाला इंडेक्स परिभाषित कर सकते हैं। ये संख्याएँ या अक्षर हो सकते हैं | NumPy सरणों तक पहुँच केवल संख्याओं का उपयोग करके उनके पूर्णांक स्थान से की जाती है। |
| अवयवों को अवरोही क्रम में भी इंडेक्स किया जा सकता है। | इंडेक्सिंग पहले अवयव के लिए शून्य से शुरू होती है और इंडेक्स निश्चित होता है। |
| यदि दो सीरीज़ संरेखित नहीं हैं, तो NaN या लापता मान उत्पन्न होते हैं। | NaN मानों की कोई संकल्पना नहीं है और यदि सरणों में मिलान मान नहीं हैं, तो संरेखन विफल हो जाता है। |
| सीरीज़ अधिक स्मृति की आवश्यकता होती है। | NumPy कम स्मृति घेरता है। |
सारांश
- NumPy, Pandas और Matplotlib वैज्ञानिक और विश्लेषणात्मक उपयोग के लिए Python लाइब्रेरी हैं।
- pip install pandas Pandas लाइब्रेरी इंस्टॉल करने का कमांड है।
- एक डेटा संरचना डेटा मानों का संग्रह और उस डेटा पर लागू किए जा सकने वाले संचालन होती है। यह डेटा को कुशलता से संग्रहीत, पुनः प्राप्त और संशोधित करने में सक्षम बनाती है।
- Pandas लाइब्रेरी की दो मुख्य डेटा संरचनाएँ Series और DataFrame हैं। इन डेटा संरचनाओं का उपयोग करने के लिए हमें पहले Pandas लाइब्रेरी आयात करनी होती है।
- एक Series एक एक-आयामी ऐरे है जिसमें मानों का क्रम होता है। प्रत्येक मान के साथ एक डेटा लेबल जुड़ा होता है जिसे इंडेक्स भी कहा जाता है।
- Series के तत्वों तक पहुँचने के दो सामान्य तरीके इंडेक्सिंग और स्लाइसिंग हैं।
- दो प्रकार के इंडेक्स होते हैं: पोज़िशनल इंडेक्स और लेबल्ड इंडेक्स। पोज़िशनल इंडेक्स एक पूर्णांक मान लेता है जो श्रृंखला में इसकी स्थिति के अनुरूप होता है 0 से शुरू होकर, जबकि लेबल्ड इंडेक्स कोई उपयोगकर्ता-परिभाषित लेबल इंडेक्स के रूप में लेता है।
- जब पोज़िशनल इंडेक्स स्लाइसिंग के लिए उपयोग किए जाते हैं, तो अंत इंडेक्स स्थिति पर मान को बाहर रखा जाता है, अर्थात् केवल (अंत - प्रारंभ) संख्या के डेटा मान श्रृंखला से निकाले जाते हैं। हालांकि लेबल्ड इंडेक्स के साथ अंत इंडेक्स लेबल पर मान को भी आउटपुट में शामिल किया जाता है।
- सभी बुनियादी गणितीय संचालन Series पर किए जा सकते हैं या तो ऑपरेटर का उपयोग करके या Series ऑब्जेक्ट की उपयुक्त विधियों का उपयोग करके।
- गणितीय संचालन करते समय इंडेक्स मिलान लागू किया जाता है और यदि संरेखण के दौरान कोई मिलान इंडेक्स नहीं मिलता है, तो Pandas NaN लौटाता है ताकि संचालन विफल न हो।
- एक DataFrame एक द्वि-आयामी लेबल्ड डेटा संरचना है जैसे एक स्प्रेडशीट। इसमें पंक्तियाँ और स्तंभ होते हैं और इसलिए इसमें पंक्ति और स्तंभ दोनों इंडेक्स होते हैं।
- जब DataFrame बनाने के लिए एक शब्दकोश का उपयोग किया जाता है, तो शब्दकोश की कुंजियाँ DataFrame के स्तंभ लेबल बन जाती हैं। एक DataFrame को सूचियों/Series के शब्दकोश के रूप में सोचा जा सकता है (सभी Series/स्तंभ एक ही पंक्ति के लिए समान इंडेक्स लेबल साझा करते हैं)।
- डेटा को डिस्क पर स्थित फ़ाइल से DataFrame में Pandas के read_csv फंक्शन का उपयोग करके लोड किया जा सकता है।
- DataFrame में डेटा को डिस्क पर टेक्स्ट फ़ाइल में pandas.DataFrame.to_csv() फंक्शन का उपयोग करके लिखा जा सकता है।
- DataFrame.T एक DataFrame का ट्रांसपोज देता है।
- Pandas में कई ऐसी विधियाँ हैं जो लेबल आधारित इंडेक्सिंग का समर्थन करती हैं लेकिन मांगा गया प्रत्येक लेबल इंडेक्स में होना चाहिए, अन्यथा KeyError उठाया जाएगा।
- DataFrame.loc[] DataFrames में पंक्तियों की लेबल आधारित इंडेक्सिंग के लिए उपयोग किया जाता है।
- Pandas.DataFrame.append() विधि दो DataFrames को मर्ज करने के लिए उपयोग की जाती है।
- Pandas गैर-अद्वितीय इंडेक्स मानों का समर्थन करता है। केवल तभी एक अपवाद उठाया जाता है जब कोई विशेष संचालन जो डुप्लिकेट इंडेक्स मानों का समर्थन नहीं करता है, प्रयास किया जाता है।
- Pandas Series और NumPy ndarray के बीच मूलभूत अंतर यह है कि Series के बीच संचालन स्वचालित रूप से लेबल के आधार पर डेटा को संरेखित करते हैं। इस प्रकार, हम गणनाएँ लिख सकते हैं बिना यह सोचे कि क्या सभी Series में समान लेबल हैं या नहीं, जबकि ndarray के मामले में यह एक त्रुटि उठाता है।
अभ्यास
1. Series क्या है और यह 1-D array, list और dictionary से कैसे भिन्न है?
2. DataFrame क्या है और यह 2-D array से कैसे भिन्न है?
3. DataFrames का Series से क्या संबंध है?
4. आप (i) Series के size, (ii) DataFrame के size से क्या समझते हैं?
5. निम्नलिखित Series बनाएं और निर्दिष्ट संचालन करें:
a) EngAlph, 26 तत्वों वाली जिसमें वर्णमाला मान हों और डिफ़ॉल्ट इंडेक्स मान हों।
b) Vowels, 5 तत्वों वाली जिसमें इंडेक्स लेबल ’ $a$ ‘, ’ $e$ ‘, ’ $\mathrm{i}$ ‘, ’ $\mathrm{o}$ ’ और ’ $\mathrm{u}$ ’ हों और सभी पाँच मान शून्य हों। जांचें कि क्या यह एक खाली series है।
c) Friends, एक dictionary से जिसमें आपके पाँच मित्रों के रोल नंबर डेटा हों और उनके पहले नाम कुंजियाँ हों।
d) MTseries, एक खाली Series। जांचें कि क्या यह एक खाली series है।
e) MonthDays, एक numpy array से जिसमें वर्ष के 12 महीनों के दिनों की संख्या हो। लेबल 1 से 12 तक महीने संख्या हों।
6. प्रश्न 5 में बनाई गई Series का उपयोग करते हुए, निम्नलिखित के लिए आदेश लिखें:
a) Vowels के सभी मान 10 पर सेट करें और Series प्रदर्शित करें।
b) Vowels के सभी मानों को 2 से विभाजित करें और Series प्रदर्शित करें।
c) एक अन्य series Vowels1 बनाएं जिसमें 5 तत्व हों और इंडेक्स लेबल ’ $a$ ‘, ’ $e$ ‘, ’ $i$ ‘, ’ $o$ ’ और ’ $u$ ’ हों और मान $[2,5,6,3,8]$ क्रमशः हों।
d) Vowels और Vowels1 को जोड़ें और परिणाम को Vowels3 में असाइन करें।
e) Vowels को Vowels1 से घटाएं, गुणा करें और विभाजित करें।
f) वर्ण स्वर 1 के लेबल को [‘A’, ’ $E$ ‘, ‘I’, ’ $O$ ‘, ’ $U$ ‘] में बदलें।
7. प्रश्न 5 में बनाए गए सीरीज़ का उपयोग करते हुए, निम्नलिखित के लिए कमांड लिखें:
a) सीरीज़ EngAlph, Vowels, Friends, MTseries, MonthDays की विमाएँ, आकार और मान ज्ञात करें।
b) सीरीज़ MTseries का नाम बदलकर SeriesEmpty रखें।
c) सीरीज़ MonthDays का इंडेक्स monthno और सीरीज़ Friends का इंडेक्स Fname नाम दें। d) सीरीज़ Friends का 3rd और 2nd मान उसी क्रम में प्रदर्शित करें।
e) सीरीज़ EngAlph से वर्ण ’ $e$ ’ से ’ $p$ ’ तक प्रदर्शित करें।
f) सीरीज़ EngAlph के पहले 10 मान प्रदर्शित करें।
g) सीरीज़ EngAlph के अंतिम 10 मान प्रदर्शित करें।
h) MTseries प्रदर्शित करें।
8. प्रश्न 5 में बनाए गए सीरीज़ का उपयोग करते हुए, निम्नलिखित के लिए कमांड लिखें:
a) सीरीज़ MonthDays से माह 3 से 7 तक के नाम प्रदर्शित करें।
b) सीरीज़ MonthDays को उल्टे क्रम में प्रदर्शित करें।
9. निम्नलिखित डेटाफ्रेम Sales बनाएँ जिसमें पाँच सेल्सपर्सन का वर्षवार बिक्री आंकड़े INR में हों। वर्षों को कॉलम लेबल के रूप में और सेल्सपर्सन के नाम को पंक्ति लेबल के रूप में प्रयोग करें।
| $\mathbf{2 0 1 4}$ | $\mathbf{2 0 1 5}$ | $\mathbf{2 0 1 6}$ | $\mathbf{2 0 1 7}$ | |
|---|---|---|---|---|
| Madhu | 100.5 | 12000 | 20000 | 50000 |
| Kusum | 150.8 | 18000 | 50000 | 60000 |
| Kinshuk | 200.9 | 22000 | 70000 | 70000 |
| Ankit | 30000 | 30000 | 100000 | 80000 |
| Shruti | 40000 | 45000 | 125000 | 90000 |
10. उपरोक्त प्रश्न 9 में बनाए गए डेटाफ्रेम का उपयोग करके निम्नलिखित करें:
a) Sales के पंक्ति लेबल प्रदर्शित करें।
b) Sales के स्तंभ लेबल प्रदर्शित करें।
c) Sales के प्रत्येक स्तंभ के डेटा प्रकार प्रदर्शित करें।
d) Sales की विमाएँ, आकृति, आकार और मान प्रदर्शित करें।
e) Sales की अंतिम दो पंक्तियाँ प्रदर्शित करें।
f) Sales के पहले दो स्तंभ प्रदर्शित करें।
g) निम्नलिखित डेटा का उपयोग करके एक शब्दकोश बनाएँ। इस शब्दकोश का उपयोग करके एक डेटाफ्रेम Sales2 बनाएँ।
| 2018 | |
|---|---|
| Madhu | 160000 |
| Kusum | 110000 |
| Kinshuk | 500000 |
| Ankit | 340000 |
| Shruti | 900000 |
h) जाँच करें कि Sales2 खाली है या इसमें डेटा है।
11. ऊपर प्रश्न 9 में बनाए गए डेटाफ्रेम का उपयोग करके निम्नलिखित करें:
a) डेटाफ्रेम Sales2 को डेटाफ्रेम Sales में जोड़ें।
b) डेटाफ्रेम Sales को इस प्रकार बदलें कि वह अपना ट्रांसपोज़ बन जाए।
c) वर्ष 2017 में सभी सेल्सपर्सन द्वारा की गई बिक्री प्रदर्शित करें।
d) वर्ष 2017 और 2018 में Madhu और Ankit द्वारा की गई बिक्री प्रदर्शित करें।
e) वर्ष 2016 में Shruti द्वारा की गई बिक्री प्रदर्शित करें।
f) Sales में Sumeet नाम के सेल्समैन के लिए डेटा जोड़ें जहाँ बिक्री [196.2, 37800, 52000, 78438, 38852] है वर्षों $[2014,2015,2016,2017$, 2018] में क्रमशः।
g) डेटाफ्रेम Sales से वर्ष 2014 का डेटा हटा दें।
h) डेटाफ्रेम Sales से सेल्समैन Kinshuk का डेटा हटा दें।
i) सेल्सपर्सन Ankit का नाम Vivaan और Madhu का नाम Shailesh में बदलें।
j) वर्ष 2018 में Shailesh द्वारा की गई बिक्री को 100000 अपडेट करें।
k) DataFrame Sales के मानों को डिस्क पर एक कॉमा सेपरेटेड फ़ाइल SalesFigures.csv में लिखें। पंक्ति लेबल और स्तंभ लेबल न लिखें।
- फ़ाइल SalesFigures.csv में मौजूद डेटा को एक DataFrame SalesRetrieved में पढ़ें और उसे प्रदर्शित करें। अब SalesRetrieved के पंक्ति लेबल और स्तंभ लेबल को Sales के समान अपडेट करें।
