我有一个数据帧 df:
>>> df = pd.DataFrame({'values':[1.23, 3.12, 23.12]}, dtype=float)
运行检查:
>>> df.values.dtype
dtype('float64')
现在使用 isinstance 方法:
>>> isinstance(df.values.dtype, float)
False
现在使用 issubdtype 方法:
>>> np.issubdtype(df.values.dtype, float)
True
通过阅读文档。
语法是实例(对象,类信息(
对象:对象实例。
我正在传递一个 ndarray 对象(我可以将其视为对象实例吗?
classinfo:包含类、类型或其他元组的类、类型或元组。
我正在传递浮点数,这是一种类型,这很好。
问题是:为什么在上面的例子中,isinstance没有返回true?isinstance和issubdtype有什么区别?
为什么在上面的例子中
isinstance
没有返回true?
因为df.values.dtype
返回一个类型,而不是该类型的对象。事实上,df.values.dtype
返回dtype('float')
,但这不是一个float
对象。它是一个dtype
对象。
issubdtype
采用dtype、type 或字符串,并检查第一种类型是相同的还是第二种类型的子类。我们可以检查该类型的方法解析顺序,并看到:
>>> df.values.dtype.type.__mro__
(<class 'numpy.float64'>, <class 'numpy.floating'>, <class 'numpy.inexact'>, <class 'numpy.number'>, <class 'numpy.generic'>,<class 'float'>, <class 'object'>)
所以类型确实是float
的一个子类。但它不是float
的实例。例如float
的实例是0.0
、3.14
、np.nan
等。如果我们检查这些对象的类型,我们会得到:
>>> type(0.0)
<class 'float'>
>>> type(3.14)
<class 'float'>
>>> type(np.nan)
<class 'float'>
而 对于dtype('float')
的类型是dtype
,而对于float
的类型,它只是type
:
>>> type(df.values.dtype)
<class 'numpy.dtype'>
>>> type(float)
<class 'type'>
因此,我们可以检查df.values.dtype
是否是dtype
的实例,并获得:
>>> isinstance(df.values.dtype, np.dtype)
True
首先,df.values.dtype
是 numpy 类 dtype 的一个实例,而不是 Python 类float
的实例:
>>> df.values.dtype
dtype('float64')
>>> isinstance(df.values.dtype, np.dtype)
True
>>> isinstance(df.values.dtype, float)
False
其次,从函数的源代码np.issubdtype
我们看到,当调用np.issubdtype(df.values.dtype, float)
时,第一个参数df.values.dtype
被转换为df.values.dtype.type
(即np.float64
(和第二个参数float
np.floating
。那么返回的是issubclass(np.float64, np.floating)
,这当然是True
。
所以,简而言之,df.values.dtype
是np.floating
的子类,而不是float
的实例。