有没有更好的方法来确定变量 in Pandas
and/or NumPy
is numeric
or not ?
我有一个dictionary
用dtypes
as 键和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 是否是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 但对于 pandas 特定类型(如 Thomas指出的 pd.Categorical )失败。如果您使用is_numeric_dtype
的是 pandas 的分类函数,则比 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
biufc
注意:b
bool、i
int(signed)、u
unsigned int、f
float、c
complex的含义。请参阅https://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.kind.html#numpy.dtype.kind
熊猫有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
只是为了添加所有其他答案,还可以使用df.info()
来获取每列的数据类型。
你也可以试试:
df_dtypes = np.array(df.dtypes)
df_numericDtypes= [x.kind in 'bifc' for x in df_dtypes]
它返回一个布尔值列表:True
如果是数字,False
如果不是。
您可以使用 dtypes 检查给定列是否包含数值
numerical_features = [feature for feature in train_df.columns if train_df[feature].dtypes != 'O']
注:“O”应为大写