यह निर्धारित करने के लिए कि पांडस / न्यूमपी में एक कॉलम / चर संख्यात्मक है या नहीं?


91

क्या यह निर्धारित करने का एक बेहतर तरीका है कि एक चर में Pandasऔर / या NumPyहै numericया नहीं?

मैं एक आत्म परिभाषित किया गया है dictionaryके साथ dtypesकुंजी और के रूप में numeric/ notमूल्यों के रूप में।


16
आप जाँच कर सकते हैं dtype.kind in 'biufc'
Jaime

1
Jaime द्वारा पोस्ट की गई इस टिप्पणी के ऊपर, नीचे वाले लोगों की तुलना में सरल था और लगता है कि उन्होंने पूरी तरह से काम किया है ...... धन्यवाद
hfrog713

जवाबों:


102

में 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

मैं कहूंगा कि यह अधिक सुरुचिपूर्ण समाधान है। साभार
as - अगर

85

आप यह np.issubdtypeजांचने के लिए उपयोग कर सकते हैं कि क्या dtype एक उप dtype है 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

Numpy के dtypes के लिए यह काम करता है लेकिन थॉमस के रूप में pd.Categorical तरह पांडा विशिष्ट प्रकार के विफल रहता है ध्यान दिया । यदि आप is_numeric_dtypeपांडा से श्रेणीबद्ध फ़ंक्शन का उपयोग कर रहे हैं, तो np.issubdtype से बेहतर विकल्प है।

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

1
यह पांडा डेटाफ़्रेम के साथ मज़बूती से काम नहीं करता है, क्योंकि वे "अनजान" की तरह अनजाने में श्रेणियों को वापस कर सकते हैं। Numpy तो "TypeError: data type नहीं समझ पाया"
थॉमस

23

टिप्पणियों में @ jaime के उत्तर के आधार पर, आपको .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

NB का अर्थ biufc: bबूल, iइंट (हस्ताक्षरित), uअहस्ताक्षरित इंट, fफ्लोट, cजटिल। Https://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.kind.html#numpy.dtype.kind देखें


3
यहाँ सभी dtype प्रकारों की सूची है [1]। लोअरकेस uबिना अंक के पूर्णांक के लिए है; अपरकेस Uयूनिकोड के लिए है। [१]: docs.scipy.org/doc/numpy/reference/generated/…
cbarrick

7

पंडों का select_dtypeकार्य है। आप आसानी से int64 पर अपने कॉलम फ़िल्टर कर सकते हैं , और float64 पर इस तरह :

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

हां, मैं यह जानने की कोशिश कर रहा था कि वे ऐसा कैसे करते हैं। एक आंतरिक IsNumeric फ़ंक्शन प्रति कॉलम में भाग लेने की उम्मीद करेगा ... लेकिन फिर भी इसे कोड में नहीं मिला
user2808117

आप इसे प्रति कॉलम लागू कर सकते हैं, लेकिन केवल dtype की जांच करना बहुत आसान है। किसी भी घटना में पांडा परिचालन गैर-संख्यात्मक को छोड़ देता है जब जरूरत होती है। तुम क्या करने की कोशिश कर रहे हो?
जेफ

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

आप जांच सकते हैं कि किसी दिए गए कॉलम में संख्यात्मक मान हैं या dtypes का उपयोग नहीं कर रहे हैं

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

नोट: "ओ" पूंजी होना चाहिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.