पंडों में प्रकार परिवर्तित करने के लिए आपके पास तीन मुख्य विकल्प हैं:
to_numeric()
- गैर-संख्यात्मक प्रकार (जैसे तार) को एक उपयुक्त संख्यात्मक प्रकार में परिवर्तित करने के लिए कार्यक्षमता प्रदान करता है। (यह भी देखें to_datetime()
और to_timedelta()
।)
astype()
- (लगभग) किसी भी प्रकार (लगभग) किसी भी अन्य प्रकार में कनवर्ट करें (भले ही ऐसा करने के लिए आवश्यक समझदार न हो)। इसके अलावा आप वर्गीकृत प्रकार (बहुत उपयोगी) में परिवर्तित करने की अनुमति देता है ।
infer_objects()
- यदि संभव हो तो पाइथन ऑब्जेक्ट्स को पंडों के प्रकार पर रखने वाले ऑब्जेक्ट कॉलम को परिवर्तित करने के लिए एक उपयोगिता विधि।
इनमें से प्रत्येक विधि के अधिक विस्तृत स्पष्टीकरण और उपयोग के लिए पढ़ें।
1। to_numeric()
किसी DataFrame के एक या अधिक स्तंभों को संख्यात्मक मानों में बदलने का सबसे अच्छा तरीका उपयोग करना है pandas.to_numeric()
।
यह फ़ंक्शन गैर-संख्यात्मक ऑब्जेक्ट (जैसे स्ट्रिंग्स) को पूर्णांक या फ़्लोटिंग पॉइंट संख्या में उपयुक्त के रूप में बदलने का प्रयास करेगा।
मूल उपयोग
इनपुट to_numeric()
एक श्रृंखला या एक DataFrame का एक कॉलम है।
>>> s = pd.Series(["8", 6, "7.5", 3, "0.9"]) # mixed string and numeric values
>>> s
0 8
1 6
2 7.5
3 3
4 0.9
dtype: object
>>> pd.to_numeric(s) # convert everything to float values
0 8.0
1 6.0
2 7.5
3 3.0
4 0.9
dtype: float64
जैसा कि आप देख सकते हैं, एक नई श्रृंखला वापस आ गई है। इसे जारी रखने के लिए एक चर या स्तंभ नाम पर इस आउटपुट को असाइन करना याद रखें:
# convert Series
my_series = pd.to_numeric(my_series)
# convert column "a" of a DataFrame
df["a"] = pd.to_numeric(df["a"])
आप apply()
विधि के माध्यम से DataFrame के कई कॉलम को परिवर्तित करने के लिए भी इसका उपयोग कर सकते हैं :
# convert all columns of DataFrame
df = df.apply(pd.to_numeric) # convert all columns of DataFrame
# convert just columns "a" and "b"
df[["a", "b"]] = df[["a", "b"]].apply(pd.to_numeric)
जब तक आपके मूल्यों को सभी में परिवर्तित किया जा सकता है, तब तक शायद यही आपकी आवश्यकता है।
गलती संभालना
लेकिन क्या होगा यदि कुछ मानों को संख्यात्मक प्रकार में परिवर्तित नहीं किया जा सकता है?
to_numeric()
एक errors
कीवर्ड तर्क भी लेता है जो आपको गैर-संख्यात्मक मानों को बाध्य करने की अनुमति देता है NaN
, या बस इन मूल्यों वाले कॉलमों को अनदेखा करता है।
यहां एक श्रृंखला का उपयोग करके एक उदाहरण s
दिया गया है, जिसमें वस्तु dtype है:
>>> s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
>>> s
0 1
1 2
2 4.7
3 pandas
4 10
dtype: object
यदि यह मान नहीं बदल सकता है तो डिफ़ॉल्ट व्यवहार को ऊपर उठाना है। इस स्थिति में, यह स्ट्रिंग 'पांडा' का सामना नहीं कर सकता:
>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')
ValueError: Unable to parse string
असफल होने के बजाय, हम चाहते हैं कि 'पांडा' को एक लापता / खराब संख्यात्मक मान माना जाए। हम कीवर्ड तर्क NaN
का उपयोग करते हुए अमान्य मानों को ले errors
सकते हैं:
>>> pd.to_numeric(s, errors='coerce')
0 1.0
1 2.0
2 4.7
3 NaN
4 10.0
dtype: float64
errors
यदि अमान्य मान सामने आया है, तो ऑपरेशन को अनदेखा करने का तीसरा विकल्प है:
>>> pd.to_numeric(s, errors='ignore')
# the original Series is returned untouched
यह अंतिम विकल्प विशेष रूप से तब उपयोगी होता है जब आप अपना पूरा डेटाफ़्रेम बदलना चाहते हैं, लेकिन यह नहीं जानते हैं कि हमारे कौन से कॉलमों को मज़बूती से एक संख्यात्मक प्रकार में परिवर्तित किया जा सकता है। उस मामले में बस लिखें:
df.apply(pd.to_numeric, errors='ignore')
फ़ंक्शन को DataFrame के प्रत्येक कॉलम पर लागू किया जाएगा। उन स्तंभों को एक संख्यात्मक प्रकार में परिवर्तित किया जा सकता है, जबकि उन कॉलमों को परिवर्तित नहीं किया जा सकता है (उदाहरण के लिए उनमें गैर-अंकों के तार या तिथियां शामिल हैं) अकेले छोड़ दिए जाएंगे।
downcasting
डिफ़ॉल्ट रूप से, के साथ रूपांतरण to_numeric()
या तो आप एक दे देंगे int64
या float64
dtype (या जो भी पूर्णांक चौड़ाई अपने मंच के मूल निवासी है)।
यह आमतौर पर आप क्या चाहते हैं, लेकिन क्या होगा अगर आप कुछ मेमोरी को बचाना चाहते थे और एक अधिक कॉम्पैक्ट dtype का उपयोग करना चाहते थे, जैसे float32
, या int8
?
to_numeric()
आपको 'पूर्णांक', 'हस्ताक्षरित', 'अहस्ताक्षरित', 'फ्लोट' को डाउनकास्ट करने का विकल्प देता है। यहाँ s
पूर्णांक प्रकार की एक सरल श्रृंखला के लिए एक उदाहरण दिया गया है :
>>> s = pd.Series([1, 2, -7])
>>> s
0 1
1 2
2 -7
dtype: int64
'पूर्णांक' के लिए डाउनकास्टिंग सबसे छोटे संभव पूर्णांक का उपयोग करता है जो मूल्यों को धारण कर सकता है:
>>> pd.to_numeric(s, downcast='integer')
0 1
1 2
2 -7
dtype: int8
'फ्लोट' को डाउनकास्टिंग करना सामान्य फ्लोटिंग प्रकार की तुलना में छोटा होता है:
>>> pd.to_numeric(s, downcast='float')
0 1.0
1 2.0
2 -7.0
dtype: float32
2। astype()
यह astype()
विधि आपके डेटाफ़्रेम या श्रृंखला के लिए इच्छित dtype के बारे में स्पष्ट होने में सक्षम बनाती है। यह बहुत बहुमुखी है कि आप एक प्रकार से किसी भी अन्य में जाने की कोशिश कर सकते हैं।
मूल उपयोग
बस एक प्रकार चुनें: आप एक NumPy dtype (जैसे np.int16
), कुछ पायथन प्रकार (जैसे बूल), या पांडा-विशिष्ट प्रकार (जैसे श्रेणीबद्ध dtype) का उपयोग कर सकते हैं।
उस ऑब्जेक्ट पर विधि को कॉल करें जिसे आप कनवर्ट करना चाहते हैं astype()
और आपके लिए इसे बदलने और बदलने की कोशिश करेंगे:
# convert all DataFrame columns to the int64 dtype
df = df.astype(int)
# convert column "a" to int64 dtype and "b" to complex type
df = df.astype({"a": int, "b": complex})
# convert Series to float16 type
s = s.astype(np.float16)
# convert Series to Python strings
s = s.astype(str)
# convert Series to categorical type - see docs for more details
s = s.astype('category')
सूचना मैंने कहा "कोशिश" - अगर astype()
यह नहीं जानता कि श्रृंखला या डेटाफ़्रेम में किसी मूल्य को कैसे परिवर्तित किया जाए, तो यह एक त्रुटि उठाएगा। उदाहरण के लिए यदि आपके पास एक NaN
या inf
मान है, तो आपको एक पूर्णांक में बदलने की कोशिश में एक त्रुटि मिलेगी।
पांडा 0.20.0 के रूप में, इस त्रुटि को पारित करके दबाया जा सकता है errors='ignore'
। आपकी मूल वस्तु वापस लौट आएगी।
सावधान रहे
astype()
शक्तिशाली है, लेकिन यह कभी-कभी मूल्यों को "गलत तरीके" में बदल देगा। उदाहरण के लिए:
>>> s = pd.Series([1, 2, -7])
>>> s
0 1
1 2
2 -7
dtype: int64
ये छोटे पूर्णांक हैं, इसलिए स्मृति को बचाने के लिए एक अहस्ताक्षरित 8-बिट प्रकार में कैसे परिवर्तित किया जाए?
>>> s.astype(np.uint8)
0 1
1 2
2 249
dtype: uint8
रूपांतरण ने काम किया, लेकिन -7 249 (यानी 2 8 - 7) बनने के लिए गोल लपेट दिया गया था !
pd.to_numeric(s, downcast='unsigned')
इसके बजाय डाउनकास्ट का उपयोग करने से इस त्रुटि को रोकने में मदद मिल सकती है।
3। infer_objects()
पंडों के संस्करण 0.21.0 ने infer_objects()
एक DataFrame के स्तंभों को परिवर्तित करने के लिए विधि पेश की, जिसमें एक वस्तु विशिष्ट प्रकार के अधिक विशिष्ट प्रकार (सॉफ्ट रूपांतरण) के लिए है।
उदाहरण के लिए, यहां ऑब्जेक्ट प्रकार के दो कॉलम के साथ एक DataFrame है। एक वास्तविक पूर्णांक रखता है और दूसरा पूर्णांक का प्रतिनिधित्व करता है:
>>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, dtype='object')
>>> df.dtypes
a object
b object
dtype: object
उपयोग करके infer_objects()
, आप कॉलम 'a' के प्रकार को int64 में बदल सकते हैं:
>>> df = df.infer_objects()
>>> df.dtypes
a int64
b object
dtype: object
कॉलम 'बी' को अकेला छोड़ दिया गया है क्योंकि इसके मूल्य स्ट्रिंग थे, पूर्णांक नहीं। यदि आप दोनों स्तंभों के रूपांतरण को पूर्णांक प्रकार से करने का प्रयास करना चाहते हैं, तो आप df.astype(int)
इसके बजाय उपयोग कर सकते हैं ।