问题:Numpy isnan()在浮点数组上失败(适用于pandas数据框)
我有一个浮点数数组(一些正常数字,一些nans),它们是从对熊猫数据框的应用中得出的。
由于某种原因,numpy.isnan在此数组上失败,但是,如下所示,每个元素都是浮点数,numpy.isnan在每个元素上正确运行,变量的类型肯定是一个numpy数组。
这是怎么回事?!
set([type(x) for x in tester])
Out[59]: {float}
tester
Out[60]:
array([-0.7000000000000001, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
nan, nan], dtype=object)
set([type(x) for x in tester])
Out[61]: {float}
np.isnan(tester)
Traceback (most recent call last):
File "<ipython-input-62-e3638605b43c>", line 1, in <module>
np.isnan(tester)
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
set([np.isnan(x) for x in tester])
Out[65]: {False, True}
type(tester)
Out[66]: numpy.ndarray
回答 0
np.isnan
可以应用于本机dtype的NumPy数组(例如np.float64):
In [99]: np.isnan(np.array([np.nan, 0], dtype=np.float64))
Out[99]: array([ True, False], dtype=bool)
但是在应用于对象数组时引发TypeError:
In [96]: np.isnan(np.array([np.nan, 0], dtype=object))
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
由于您拥有Pandas,pd.isnull
因此可以改用-它可以接受对象或本机dtypes的NumPy数组:
In [97]: pd.isnull(np.array([np.nan, 0], dtype=float))
Out[97]: array([ True, False], dtype=bool)
In [98]: pd.isnull(np.array([np.nan, 0], dtype=object))
Out[98]: array([ True, False], dtype=bool)
请注意,None
在对象数组中也将其视为空值。
回答 1
np.isnan()和pd.isnull()的绝佳替代品是
for i in range(0,a.shape[0]):
if(a[i]!=a[i]):
//do something here
//a[i] is nan
因为只有nan不等于自己。
回答 2
在@unutbu答案的顶部,您可以将pandas numpy对象数组强制转换为本机(float64)类型,沿线进行操作
import pandas as pd
pd.to_numeric(df['tester'], errors='coerce')
指定errors =’coerce’强制将无法解析为数字值的字符串变为NaN。列类型为dtype: float64
,然后isnan
检查是否可以使用
回答 3
确保使用熊猫导入csv文件
import pandas as pd
condition = pd.isnull(data[i][j])