জিজ্ঞাসিত প্রশ্নের শিরোনাম সাধারণ, তবে লেখকরা প্রশ্নের শিরোনামে বর্ণিত কেসটি সুনির্দিষ্টভাবে ব্যবহার করেন। সুতরাং অন্য কোনও উত্তর ব্যবহার করা যেতে পারে।
তবে শিরোনাম প্রশ্নের পুরোপুরি উত্তর দেওয়ার জন্য এটি স্পষ্ট করে বলা উচিত যে দেখে মনে হচ্ছে যে সমস্ত পদ্ধতির কোনও কোনও ক্ষেত্রে ব্যর্থ হতে পারে এবং কিছু পুনরায় কাজ করা প্রয়োজন। আমি নির্ভরযোগ্যতা ক্রম হ্রাস করার জন্য তাদের সমস্ত (এবং কিছু অতিরিক্ত) পর্যালোচনা করেছি (আমার মতে):
1. সরাসরি ==
(গ্রহণযোগ্য উত্তর) মাধ্যমে প্রকারের সাথে তুলনা করা ।
এটি উত্তর গৃহীত হয়েছে এবং সর্বাধিক উন্নত গণনা রয়েছে সত্ত্বেও, আমি মনে করি এই পদ্ধতিটি মোটেই ব্যবহার করা উচিত নয়। কারণ প্রকৃতপক্ষে এখানে বহুবার উল্লিখিত হিসাবে অ্যাসথনে এই পদ্ধতিকে নিরুৎসাহিত করা হয়েছে ।
কিন্তু যদি এক এখনও এটি ব্যবহার করতে চান - মত কিছু পান্ডাস-নির্দিষ্ট dtypes সচেতন হওয়া উচিত pd.CategoricalDType
, pd.PeriodDtype
অথবা pd.IntervalDtype
। type( )
টাইপটি সঠিকভাবে সনাক্ত করতে এখানে অতিরিক্ত ব্যবহার করতে হবে:
s = pd.Series([pd.Period('2002-03','D'), pd.Period('2012-02-01', 'D')])
s
s.dtype == pd.PeriodDtype # Not working
type(s.dtype) == pd.PeriodDtype # working
>>> 0 2002-03-01
>>> 1 2012-02-01
>>> dtype: period[D]
>>> False
>>> True
এখানে আরেকটি সতর্কতাই হ'ল এই ধরণেরটি নির্দিষ্টভাবে উল্লেখ করা উচিত:
s = pd.Series([1,2])
s
s.dtype == np.int64 # Working
s.dtype == np.int32 # Not working
>>> 0 1
>>> 1 2
>>> dtype: int64
>>> True
>>> False
2. isinstance()
পদ্ধতির।
এই পদ্ধতিটি এখনও পর্যন্ত উত্তরে উল্লেখ করা হয়নি।
সুতরাং প্রকারের সাথে সরাসরি তুলনা করা যদি ভাল ধারণা না হয় - তবে এই উদ্দেশ্যে স্বতন্ত্র পাইথন ফাংশনটি চেষ্টা করে দেখি - isinstance()
।
এটা ঠিক শুরুতে ব্যর্থ হয়, কারণ ধরে নেয় যে আমরা কিছু বস্তু আছে, কিন্তু pd.Series
বা pd.DataFrame
পূর্বনির্ধারিত কেবল খালি পাত্রে হিসাবে ব্যবহার করা যেতে পারে dtype
কিন্তু এটা কোন বস্তু:
s = pd.Series([], dtype=bool)
s
>>> Series([], dtype: bool)
তবে যদি কেউ কোনওভাবে এই সমস্যাটি অতিক্রম করে এবং প্রতিটি বস্তু অ্যাক্সেস করতে চায়, উদাহরণস্বরূপ, প্রথম সারিতে এবং এর টাইপটি এর মতো কিছু পরীক্ষা করে:
df = pd.DataFrame({'int': [12, 2], 'dt': [pd.Timestamp('2013-01-02'), pd.Timestamp('2016-10-20')]},
index = ['A', 'B'])
for col in df.columns:
df[col].dtype, 'is_int64 = %s' % isinstance(df.loc['A', col], np.int64)
>>> (dtype('int64'), 'is_int64 = True')
>>> (dtype('<M8[ns]'), 'is_int64 = False')
এটি একক কলামে মিশ্রিত ধরণের ডেটার ক্ষেত্রে বিভ্রান্তিকর হবে:
df2 = pd.DataFrame({'data': [12, pd.Timestamp('2013-01-02')]},
index = ['A', 'B'])
for col in df2.columns:
df2[col].dtype, 'is_int64 = %s' % isinstance(df2.loc['A', col], np.int64)
>>> (dtype('O'), 'is_int64 = False')
এবং শেষ কিন্তু সর্বনিম্ন নয় - এই পদ্ধতিটি সরাসরি Category
টাইপকে চিনতে পারে না । দস্তাবেজে যেমন বলা হয়েছে :
শ্রেণীবদ্ধ তথ্য থেকে একটি আইটেম ফেরত মান "1" দৈর্ঘ্যের শ্রেণীবদ্ধ নয়, মান প্রদান করবে।
df['int'] = df['int'].astype('category')
for col in df.columns:
df[col].dtype, 'is_int64 = %s' % isinstance(df.loc['A', col], np.int64)
>>> (CategoricalDtype(categories=[2, 12], ordered=False), 'is_int64 = True')
>>> (dtype('<M8[ns]'), 'is_int64 = False')
সুতরাং এই পদ্ধতিটি প্রায় অগ্রহণযোগ্য।
3. df.dtype.kind
পদ্ধতির।
এই পদ্ধতি এখনো খালি সাথে কাজ করতে পারে pd.Series
বা pd.DataFrames
অন্য সমস্যা রয়েছে।
প্রথম - এটি কিছু টাইপগুলি পৃথক করতে অক্ষম:
df = pd.DataFrame({'prd' :[pd.Period('2002-03','D'), pd.Period('2012-02-01', 'D')],
'str' :['s1', 's2'],
'cat' :[1, -1]})
df['cat'] = df['cat'].astype('category')
for col in df:
# kind will define all columns as 'Object'
print (df[col].dtype, df[col].dtype.kind)
>>> period[D] O
>>> object O
>>> category O
দ্বিতীয়ত, আমার জন্য কি আসলে এখনো স্পষ্ট নয়, এটা এমন কিছু dtypes আয় কোনটি ।
4. df.select_dtypes
পদ্ধতির।
এটি আমরা যা চাই প্রায় এটিই। এই পদ্ধতিটি পান্ডার ভিতরে নকশা করা হয়েছে যাতে এটি পূর্বে উল্লিখিত বেশিরভাগ কোণার কেসগুলি পরিচালনা করে - খালি ডেটাফ্রেমগুলি, আঙ্কুল বা পান্ডাস-নির্দিষ্ট ধরণের টাইপের চেয়ে আলাদা। এটি সিঙ্গল টাইপের মতো ভালো কাজ করে .select_dtypes('bool')
। এটি টাইপয়ের উপর ভিত্তি করে কলামগুলির গোষ্ঠীগুলি নির্বাচনের জন্যও ব্যবহার করা যেতে পারে:
test = pd.DataFrame({'bool' :[False, True], 'int64':[-1,2], 'int32':[-1,2],'float': [-2.5, 3.4],
'compl':np.array([1-1j, 5]),
'dt' :[pd.Timestamp('2013-01-02'), pd.Timestamp('2016-10-20')],
'td' :[pd.Timestamp('2012-03-02')- pd.Timestamp('2016-10-20'),
pd.Timestamp('2010-07-12')- pd.Timestamp('2000-11-10')],
'prd' :[pd.Period('2002-03','D'), pd.Period('2012-02-01', 'D')],
'intrv':pd.arrays.IntervalArray([pd.Interval(0, 0.1), pd.Interval(1, 5)]),
'str' :['s1', 's2'],
'cat' :[1, -1],
'obj' :[[1,2,3], [5435,35,-52,14]]
})
test['int32'] = test['int32'].astype(np.int32)
test['cat'] = test['cat'].astype('category')
ডক্সগুলিতে যেমন বলা হয়েছে তেমন :
test.select_dtypes('number')
>>> int64 int32 float compl td
>>> 0 -1 -1 -2.5 (1-1j) -1693 days
>>> 1 2 2 3.4 (5+0j) 3531 days
অন ভাবতে পারে যে এখানে আমরা প্রথম অপ্রত্যাশিত দেখতে পাই (আমার জন্য ব্যবহৃত: প্রশ্ন ) ফলাফল - TimeDelta
আউটপুটে অন্তর্ভুক্ত DataFrame
। বিপরীতে উত্তর হিসাবে এটি যেমন হওয়া উচিত, কিন্তু এক এটি সচেতন হতে হবে। লক্ষ্য করুন bool
এড়ানো dtype, যে এছাড়াও কারো জন্য অবাঞ্ছিত হতে পারে, কিন্তু এটি কারণে bool
এবং number
ভিন্ন "হয় সাব-ট্রি numpy dtypes এর"। বুলের ক্ষেত্রে আমরা test.select_dtypes(['bool'])
এখানে ব্যবহার করতে পারি।
এই পদ্ধতির পরবর্তী সীমাবদ্ধতাটি হ'ল পান্ডার বর্তমান সংস্করণে (0.24.2), এই কোড: test.select_dtypes('period')
উত্থাপন করবে NotImplementedError
।
এবং আরেকটি বিষয় হ'ল এটি অন্যান্য বস্তুর থেকে স্ট্রিংয়ের পার্থক্য করতে অক্ষম:
test.select_dtypes('object')
>>> str obj
>>> 0 s1 [1, 2, 3]
>>> 1 s2 [5435, 35, -52, 14]
তবে এটি হ'ল প্রথম - ডক্সে ইতিমধ্যে উল্লিখিত । এবং দ্বিতীয় - এই পদ্ধতির সমস্যা নয়, বরং স্ট্রিংগুলি যেভাবে সংরক্ষণ করা হয় DataFrame
। তবে যাইহোক এই ক্ষেত্রে কিছু পোস্ট প্রসেসিং থাকতে হবে।
5. df.api.types.is_XXX_dtype
পদ্ধতির।
আমার ধারণা হিসাবে এটি একটাই ধরণের এবং স্বীকৃতি অর্জনের সবচেয়ে শক্তিশালী এবং দেশীয় উপায় (মডিউলটির পথ যেখানে ফাংশনগুলি থাকে সেগুলি নিজেই বলে) এবং এটি প্রায় নিখুঁতভাবে কাজ করে তবে তারপরেও কমপক্ষে একটি ক্যাভেট রয়েছে এবং এখনও স্ট্রিং কলামগুলিকে আলাদা করতে হবে ।
এছাড়াও, এটি বিষয়গত হতে পারে তবে এই পদ্ধতির সাথে আরও 'মানব-বোধগম্য' number
টাইপ গ্রুপ প্রসেসিংয়ের তুলনা রয়েছে .select_dtypes('number')
:
for col in test.columns:
if pd.api.types.is_numeric_dtype(test[col]):
print (test[col].dtype)
>>> bool
>>> int64
>>> int32
>>> float64
>>> complex128
না timedelta
এবং bool
অন্তর্ভুক্ত করা হয়। পারফেক্ট।
আমার পাইপলাইন সময়ের এই মুহুর্তে ঠিক এই কার্যকারিতাটি ব্যবহার করে, পোস্ট হ্যান্ড প্রসেসিংয়ের একটি বিট।
আউটপুট।
আশা করি আমি মূল বিষয়টিতে তর্ক করতে সক্ষম হয়েছি - যে সমস্ত আলোচিত পন্থা ব্যবহার করা যেতে পারে তবে কেবল pd.DataFrame.select_dtypes()
এবং pd.api.types.is_XXX_dtype
প্রয়োগযোগ্য হিসাবে সত্যই বিবেচনা করা উচিত।
string
কোনও টাইপ নয়