পান্ডায় ধরণের রূপান্তর করার জন্য আপনার কাছে তিনটি প্রধান বিকল্প রয়েছে:
to_numeric()
- অ-সংখ্যাগত প্রকারের (যেমন স্ট্রিংগুলি) একটি উপযুক্ত সংখ্যার প্রকারে নিরাপদে রূপান্তর করতে কার্যকারিতা সরবরাহ করে। (আরও দেখুন to_datetime()
এবং to_timedelta()
।)
astype()
- (প্রায়) যে কোনও প্রকারকে (প্রায়) অন্য কোনও প্রকারে রূপান্তর করুন (এটি করার জন্য এটি বোধগম্য না হলেও)। এছাড়াও আপনাকে শ্রেণিবদ্ধ ধরণের রূপান্তর করতে দেয় (খুব দরকারী)।
infer_objects()
- পাইথন অবজেক্ট ধারণকারী অবজেক্ট কলামগুলি যদি সম্ভব হয় একটি পান্ডাস প্রকারে রূপান্তর করার জন্য একটি ইউটিলিটি পদ্ধতি।
এই প্রতিটি পদ্ধতির আরও বিস্তারিত ব্যাখ্যা এবং ব্যবহারের জন্য পড়ুন Read
1। to_numeric()
ডেটাফ্রেমের এক বা একাধিক কলামকে সংখ্যার মানগুলিতে রূপান্তর করার সর্বোত্তম উপায় হ'ল ব্যবহার করা pandas.to_numeric()
।
এই ফাংশনটি সংখ্যাসূচক অবজেক্টগুলিকে (যেমন স্ট্রিংগুলি) যথাযথ হিসাবে পূর্ণসংখ্যার বা ভাসমান পয়েন্ট সংখ্যাগুলিতে পরিবর্তন করার চেষ্টা করবে।
বেসিক ব্যবহার
ইনপুটটি to_numeric()
হ'ল সিরিজ বা ডেটাফ্রেমের একক কলাম।
>>> 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()
পদ্ধতির মাধ্যমে ডেটা ফ্রেমের একাধিক কলাম রূপান্তর করতেও এটি ব্যবহার করতে পারেন :
# 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
হয়েছে যার মধ্যে ডাইটিপ অবজেক্ট রয়েছে:
>>> 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')
ফাংশনটি ডেটা ফ্রেমের প্রতিটি কলামে প্রয়োগ করা হবে। একটি সংখ্যার ধরণের রূপান্তরিত করা যায় এমন কলামগুলি রূপান্তরিত হবে, যখন কলামগুলি (যেমন তাদের অ-অঙ্কের স্ট্রিং বা তারিখ রয়েছে) একা থাকবে।
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 আপনি আপনার DataFrame বা সিরিজ করতে চান সম্পর্কে স্পষ্ট হতে সক্ষম করে। এটি খুব বহুমুখী যাতে আপনি চেষ্টা করতে পারেন এবং এক ধরণের থেকে অন্য প্রকারে যেতে পারেন।
বেসিক ব্যবহার
কেবল একটি প্রকার বাছাই করুন: আপনি একটি NumPy dtype (উদাঃ np.int16
), কিছু পাইথন প্রকার (যেমন bool), বা পান্ডাস-নির্দিষ্ট প্রকার (শ্রেণীবদ্ধ 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()
একটি ডেটাফ্রেমের কলামগুলিকে রূপান্তর করার পদ্ধতিটি চালু করেছে যার মধ্যে একটি নির্দিষ্ট ধরণের (সফ্ট রূপান্তর) তে একটি অবজেক্ট ডাটাটাইপ রয়েছে।
উদাহরণস্বরূপ, এখানে অবজেক্ট টাইপের দুটি কলাম সহ একটি ডেটা ফ্রেম রয়েছে। একটিতে প্রকৃত পূর্ণসংখ্যা থাকে এবং অন্যটির কাছে পূর্ণসংখ্যার প্রতিনিধিত্ব করে স্ট্রিং থাকে:
>>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, dtype='object')
>>> df.dtypes
a object
b object
dtype: object
ব্যবহার করে infer_objects()
, আপনি কলাম 'এ' প্রকারটি int64 এ পরিবর্তন করতে পারেন:
>>> df = df.infer_objects()
>>> df.dtypes
a int64
b object
dtype: object
কলাম 'বি' একাকী রেখে গেছে কারণ এর মানগুলি পূর্ণসংখ্যা নয়, স্ট্রিং ছিল। আপনি যদি উভয় কলামকে একটি পূর্ণসংখ্যার ধরণের রূপান্তর করতে চেষ্টা করতে এবং বাধ্য করতে চান, আপনি df.astype(int)
পরিবর্তে ব্যবহার করতে পারেন ।