अध्याय 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 के बीच कुछ अंतर दिए गए हैं:

  1. NumPy array समरूप डेटा की आवश्यकता होती है, जबकि Pandas DataFrame में विभिन्न डेटा प्रकार (float, int, string, datetime आदि) हो सकते हैं।
  2. Pandas में फ़ाइल लोडिंग, प्लॉटिंग, चयन, जॉइनिंग, GROUP BY जैसे संचालनों के लिए सरल इंटरफ़ेस होता है, जो डेटा-प्रोसेसिंग अनुप्रयोगों में बहुत उपयोगी सिद्ध होते हैं।
  3. Pandas DataFrames (कॉलम नामों के साथ) डेटा को ट्रैक करना बहुत आसान बना देते हैं।
  4. जब डेटा टैब्युलर प्रारूप में होता है तब 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 में लिखें। पंक्ति लेबल और स्तंभ लेबल न लिखें।

  1. फ़ाइल SalesFigures.csv में मौजूद डेटा को एक DataFrame SalesRetrieved में पढ़ें और उसे प्रदर्शित करें। अब SalesRetrieved के पंक्ति लेबल और स्तंभ लेबल को Sales के समान अपडेट करें।