学生:
老师,请教一下,为什么空值显示有nan和NaN两种?
nan是numpy.float64格式,NaN是float格式,两者有什么不同吗?
老师:
你可以认为成没有区别,只要确保你的变量的缺失值是float就可以了
具体一些细节尝试如下:
演示数据:
import pandas as pd
import numpy as np
data1=pd.read_excel(r"D:\python课程\数据清洗(5)\pandas\test3.xlsx")
#用spder导入数据之后,各个变量的类型是姓名:object,年龄:int64,身高:float64,体重:int64,性别:object
#
'''
身高列的缺失值在前台显示位nan,
data1.loc[2,"身高"]
Out[97]: nan
type(data1.loc[2,"身高"])
Out[99]: numpy.float64
性别列的缺失值在前台显示为NaN
data1.loc[1,"性别"]
Out[98]: nan
type(data1.loc[1,"性别"])
Out[100]: float
nan是numpy.float64类,NaN是float类,两者有什么不同吗?
data1.loc[2,"身高"]==data1.loc[1,"性别"]
Out[101]: False
a1=float(data1.loc[2,"身高"])
a2=data1.loc[1,"性别"]
a1
Out[107]: nan
a2
Out[108]: nan
type(a1)
Out[109]: float
type(a2)
Out[110]: float
a1==a2
Out[111]: False
可以看到a1和a2的值是一样的,a1和a2的类也是一样的,但是执行双等号的比较,返回还是False
这是什么原因导致的呢?
a1
Out[122]: nan
a2
Out[123]: nan
id(a1)
Out[124]: 226363152
id(a2)
Out[125]: 82576464
可以看到两个float变量的id是不一样的。也就是说缺失值不能算是一个常量。也就是用各种库生成的缺失值并不是电脑中的唯一储存地址
isinstance(a1,np.float)
Out[133]: True
isinstance(a2,np.float)
Out[134]: True
a1==a2
Out[135]: False
isinstance(a1,float)
Out[136]: True
isinstance(a2,float)
Out[137]: True
然后我们尝试将缺失值由float类型转化为np.float64类型
b1=data1.loc[2,"身高"]
b2=np.float64(data1.loc[1,"性别"])
b1==b2
Out[152]: False
type(b1)
Out[153]: numpy.float64
type(b2)
Out[154]: numpy.float64
既然无论如何也不能让两者完全相等,而两者都是float都是缺失值,也不影响在pandas中进行缺失值的判断
我们就把他们当作无差别的float缺失值使用吧。
'''
总结发现。
如果一个Series对象的dtype是float64,如果这个series里面有一个缺失值,
这个缺失值在前台就会显示为nan,单独看这一个缺失值的类型,会发现是np.float64类型
In [173]: data1["身高"]
Out[173]:
0 170.000
1 180.000
2 nan
3 180.000
Name: 身高, dtype: float64
In [177]: type(data1["身高"][2])
Out[177]: numpy.float64
2.如果将前面的序列,转化为类型为 Object类型,这个时候缺失值在前台显示为NaN。
单独看这一个缺失值的类型,会发现是float类型
m1=data1["身高"].astype(object)
In [176]: m1
Out[176]:
0 170.000
1 180.000
2 NaN
3 180.000
Name: 身高, dtype: object
type(m1[2])
Out[175]: float
3.也就是当你的列或者说变量的dtype不一样的时候,缺失值的显示格式是不一样的,可能显示为nan也可能显示为NaN,但都表示缺失值的意思。
In [166]: data1.loc[2,"性别"]=data1.loc[1,"身高"]
In [167]: data1
Out[167]:
姓名 年龄 身高 体重 性别
0 张三 18 170.000 180 男
1 李四 17 180.000 150 NaN
2 王五 16 nan 90 180.000
3 赵六 18 180.000 200 赵
这是在spyder中总结的规律,到了jupyter notebook中又会是另一番情景,不同的人和不同的数据、
软件版本操作可能得到的结果又不一样。
可以说缺失值在python里面算是一个比较神奇的存在,我们不要太纠结这些,只要是知道无论哪种格式,都会被缺失值检测函数检查出来就可以了。