পান্ডস / নুমপিতে কোনও কলাম / পরিবর্তনশীল সংখ্যাসঙ্গিক কিনা তা কীভাবে নির্ধারণ করবেন?


90

ভেরিয়েবল কিনা তা নির্ধারণের জন্য আরও ভাল উপায় আছে কি? Pandas এবং / বা NumPyহয় numericবা না ?

আমি কী হিসাবে এবং / মান হিসাবে স্ব সংজ্ঞায়িত dictionaryকরেছি ।dtypesnumericnot


16
আপনি পরীক্ষা করতে পারেন dtype.kind in 'biufc'
জাইমে

উত্তর:


101

ইন 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

আমি বলব এটি আরও মার্জিত সমাধান। ধন্যবাদ
যেমন -

85

আপনি 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

4
এটি প্যান্ডাস ডেটা ফ্রেমগুলির সাথে নির্ভরযোগ্যভাবে কাজ করছে বলে মনে হয় না, কারণ এইগুলি "বিভাগ" এর মতো অদৃশ্য শ্রেণিতে অজ্ঞাতগুলিতে ফিরে আসতে পারে। নম্পি তারপরে "প্রকারের ত্রুটি: ডেটা টাইপ বোঝা যায় নি"
থমাস

23

মন্তব্যে @ জাইমের উত্তরের ভিত্তিতে আপনার .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 দেখুন


4
এখানে সমস্ত ধরণের টাইপের তালিকা রয়েছে [1]। লোয়ারকেস uস্বাক্ষরবিহীন পূর্ণসংখ্যার জন্য; বড় হাতের অক্ষর Uইউনিকোডের জন্য। [১]: ডকসস.সিপি.ইআর
ডক

7

পান্ডসের select_dtypeকাজ আছে। আপনি সহজেই আপনার কলামগুলিকে অন্তত 64৪ এবং ফিলোট 64 এ ফিল্টার করতে পারবেন :

df.select_dtypes(include=['int64','float64'])

4

এটি কেবলমাত্র সংখ্যার ধরণের ডেটা ফেরত দেওয়ার জন্য এটি ছদ্ম-অভ্যন্তরীণ পদ্ধতি

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

হ্যাঁ, আমি কীভাবে তারা এটি করে তা বোঝার চেষ্টা করছিলাম। কেউ প্রত্যাশা করতে পারে যে কোনও অভ্যন্তরীণ ইসনুমেরিক ফাংশন কলাম অনুসারে চলবে ... তবে এখনও
কোডটিতে

আপনি এটি প্রতি কলামে প্রয়োগ করতে পারেন, তবে কেবলমাত্র টাইপটি পরীক্ষা করতে। যে কোনও ইভেন্টের পান্ডাস অপারেশনে অ-সংখ্যাসূচককে বাদ দেওয়া হয় যখন প্রয়োজন হয়। আপনি কি করতে চেষ্টা করছেন?
জেফ

4

কলামের মানগুলির মধ্যে কেবল একটির জন্য কীভাবে পরীক্ষা করা যায়? আমাদের সর্বদা এরকম কিছু ছিল:

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

1

আপনিও চেষ্টা করতে পারেন:

df_dtypes = np.array(df.dtypes)
df_numericDtypes= [x.kind in 'bifc' for x in df_dtypes]

এটি বুলিয়ানগুলির একটি তালিকা প্রদান করে: Trueযদি সংখ্যাসূচক হয়, Falseযদি না হয়।


1

কেবলমাত্র সমস্ত অন্যান্য উত্তর যুক্ত করতে df.info(), প্রতিটি কলামের ডেটা টাইপ কী পেতে পারে তা ব্যবহার করতে পারেন।


1

প্রদত্ত কলামে সংখ্যাসূচক মান রয়েছে কি না তা টাইপ ব্যবহার না করে আপনি তা পরীক্ষা করতে পারেন

numerical_features = [feature for feature in train_df.columns if train_df[feature].dtypes != 'O']

দ্রষ্টব্য: "ও" মূলধন হওয়া উচিত

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.