ভেরিয়েবল কিনা তা নির্ধারণের জন্য আরও ভাল উপায় আছে কি? Pandas
এবং / বা NumPy
হয় numeric
বা না ?
আমি কী হিসাবে এবং / মান হিসাবে স্ব সংজ্ঞায়িত dictionary
করেছি ।dtypes
numeric
not
ভেরিয়েবল কিনা তা নির্ধারণের জন্য আরও ভাল উপায় আছে কি? Pandas
এবং / বা NumPy
হয় numeric
বা না ?
আমি কী হিসাবে এবং / মান হিসাবে স্ব সংজ্ঞায়িত dictionary
করেছি ।dtypes
numeric
not
উত্তর:
ইন pandas 0.20.2
আপনি কি করতে পারেন:
import pandas as pd
from pandas.api.types import is_string_dtype
from pandas.api.types import is_numeric_dtype
df = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': [1.0, 2.0, 3.0]})
is_string_dtype(df['A'])
>>>> True
is_numeric_dtype(df['B'])
>>>> True
আপনি np.issubdtype
টাইপটি টাইপটির একটি উপ-টাইপ কিনা তা পরীক্ষা করতে ব্যবহার করতে পারেন np.number
। উদাহরণ:
np.issubdtype(arr.dtype, np.number) # where arr is a numpy array
np.issubdtype(df['X'].dtype, np.number) # where df['X'] is a pandas Series
এটি নম্পির ধরণের টাইপের জন্য কাজ করে তবে থমাসের উল্লেখ অনুসারে pd.Categorical এর মতো প্যান্ডাস নির্দিষ্ট ধরণের জন্য ব্যর্থ হয় । আপনি যদি is_numeric_dtype
পান্ডা থেকে শ্রেণিবদ্ধ ফাংশন ব্যবহার করছেন তবে এনপি.আইসুবডিটাইপের চেয়ে ভাল বিকল্প।
df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0],
'C': [1j, 2j, 3j], 'D': ['a', 'b', 'c']})
df
Out:
A B C D
0 1 1.0 1j a
1 2 2.0 2j b
2 3 3.0 3j c
df.dtypes
Out:
A int64
B float64
C complex128
D object
dtype: object
np.issubdtype(df['A'].dtype, np.number)
Out: True
np.issubdtype(df['B'].dtype, np.number)
Out: True
np.issubdtype(df['C'].dtype, np.number)
Out: True
np.issubdtype(df['D'].dtype, np.number)
Out: False
একাধিক কলামের জন্য আপনি np.vectorize ব্যবহার করতে পারেন:
is_number = np.vectorize(lambda x: np.issubdtype(x, np.number))
is_number(df.dtypes)
Out: array([ True, True, True, False], dtype=bool)
এবং নির্বাচনের জন্য, পান্ডাস এখন রয়েছে select_dtypes
:
df.select_dtypes(include=[np.number])
Out:
A B C
0 1 1.0 1j
1 2 2.0 2j
2 3 3.0 3j
মন্তব্যে @ জাইমের উত্তরের ভিত্তিতে আপনার .dtype.kind
আগ্রহের কলামটি পরীক্ষা করা দরকার । উদাহরণ স্বরূপ;
>>> import pandas as pd
>>> df = pd.DataFrame({'numeric': [1, 2, 3], 'not_numeric': ['A', 'B', 'C']})
>>> df['numeric'].dtype.kind in 'biufc'
>>> True
>>> df['not_numeric'].dtype.kind in 'biufc'
>>> False
এনবি এর অর্থ biufc
: b
বুল, i
ইন (স্বাক্ষরিত), u
স্বাক্ষরবিহীন ইনট, f
ফ্লোট, c
জটিল। Https://docs.scipy.org/doc/numpy/references/generated/numpy.dtype.Point.html#numpy.dtype.Point দেখুন
u
স্বাক্ষরবিহীন পূর্ণসংখ্যার জন্য; বড় হাতের অক্ষর U
ইউনিকোডের জন্য। [১]: ডকসস.সিপি.ইআর
পান্ডসের select_dtype
কাজ আছে। আপনি সহজেই আপনার কলামগুলিকে অন্তত 64৪ এবং ফিলোট 64 এ ফিল্টার করতে পারবেন :
df.select_dtypes(include=['int64','float64'])
এটি কেবলমাত্র সংখ্যার ধরণের ডেটা ফেরত দেওয়ার জন্য এটি ছদ্ম-অভ্যন্তরীণ পদ্ধতি
In [27]: df = DataFrame(dict(A = np.arange(3),
B = np.random.randn(3),
C = ['foo','bar','bah'],
D = Timestamp('20130101')))
In [28]: df
Out[28]:
A B C D
0 0 -0.667672 foo 2013-01-01 00:00:00
1 1 0.811300 bar 2013-01-01 00:00:00
2 2 2.020402 bah 2013-01-01 00:00:00
In [29]: df.dtypes
Out[29]:
A int64
B float64
C object
D datetime64[ns]
dtype: object
In [30]: df._get_numeric_data()
Out[30]:
A B
0 0 -0.667672
1 1 0.811300
2 2 2.020402
কলামের মানগুলির মধ্যে কেবল একটির জন্য কীভাবে পরীক্ষা করা যায়? আমাদের সর্বদা এরকম কিছু ছিল:
isinstance(x, (int, long, float, complex))
আমি যখন নীচে ডেটাফ্রেমের কলামগুলির জন্য ডেটাটাইপগুলি পরীক্ষা করার চেষ্টা করি তখন আমি সেগুলিকে 'অবজেক্ট' হিসাবে পাই এবং এটি এমন একটি সংখ্যাসূচক নয় যা আমি প্রত্যাশা করছি:
df = pd.DataFrame(columns=('time', 'test1', 'test2'))
for i in range(20):
df.loc[i] = [datetime.now() - timedelta(hours=i*1000),i*10,i*100]
df.dtypes
time datetime64[ns]
test1 object
test2 object
dtype: object
আমি যখন নিম্নলিখিতগুলি করি, মনে হয় এটি আমাকে সঠিক ফলাফল দেয়:
isinstance(df['test1'][len(df['test1'])-1], (int, long, float, complex))
প্রত্যাবর্তন
True
প্রদত্ত কলামে সংখ্যাসূচক মান রয়েছে কি না তা টাইপ ব্যবহার না করে আপনি তা পরীক্ষা করতে পারেন
numerical_features = [feature for feature in train_df.columns if train_df[feature].dtypes != 'O']
দ্রষ্টব্য: "ও" মূলধন হওয়া উচিত
dtype.kind in 'biufc'
।