क्या यह निर्धारित करने का एक बेहतर तरीका है कि एक चर में 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
जांचने के लिए उपयोग कर सकते हैं कि क्या 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
टिप्पणियों में @ 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 देखें
u
बिना अंक के पूर्णांक के लिए है; अपरकेस U
यूनिकोड के लिए है। [१]: docs.scipy.org/doc/numpy/reference/generated/…
पंडों का select_dtype
कार्य है। आप आसानी से int64 पर अपने कॉलम फ़िल्टर कर सकते हैं , और float64 पर इस तरह :
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
आप जांच सकते हैं कि किसी दिए गए कॉलम में संख्यात्मक मान हैं या dtypes का उपयोग नहीं कर रहे हैं
numerical_features = [feature for feature in train_df.columns if train_df[feature].dtypes != 'O']
नोट: "ओ" पूंजी होना चाहिए
dtype.kind in 'biufc'
।