如何确定列/变量在Pandas / NumPy中是否为数字?


88

有没有更好的方法来确定inPandas和/或NumPyis中的变量numeric

我定义了一个自我dictionarydtypes密钥和numeric/not作为值。


15
您可以检查dtype.kind in 'biufc'
Jaime

1
海梅(Jaime)在此上面发表的评论比下面的评论更简单,并且似乎运行得很好……谢谢
hfrog713 '18

Answers:


97

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

我会说这是更优雅的解决方案。谢谢
好像-

84

您可以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的dtype,但不适用于特定于熊猫的类型,如Thomas指出的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
这似乎无法与pandas DataFrames可靠地一起工作,因为它们可能返回numpy未知的类别,例如“ category”。Numpy然后抛出“ TypeError:无法理解的数据类型”
Thomas

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

注意biufcbbool,iint(有符号),uunsigned int,ffloat,ccomplex的含义。参见https://docs.scipy.org/doc/numpy/reference/generation/numpy.dtype.kind.html#numpy.dtype.kind


3
这是所有dtype类型的列表[1]。小写字母u表示无符号整数;大写U用于unicode。[1]:docs.scipy.org/doc/numpy/reference/generation/…–
cbarrick

7

熊猫具有select_dtype功能。您可以像这样轻松过滤int64float64上的列:

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 2013年

您可以在每列中应用此选项,但仅检查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.info()用来获取每一列的数据类型。


1

您可以使用dtypes检查给定的列是否包含数值

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

注意:“ O”应为大写


0

您也可以尝试:

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

它返回一个布尔值列表:True如果是数字,False则不是。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.