ermutuxia

2021-03-08   阅读量: 1155

Python

老师,请教一下,为什么空值显示有nan和NaN两种?

扫码加入数据分析学习群

学生:


老师,请教一下,为什么空值显示有nan和NaN两种?

9.png


nan是numpy.float64格式,NaN是float格式,两者有什么不同吗?

老师:


你可以认为成没有区别,只要确保你的变量的缺失值是float就可以了



具体一些细节尝试如下:

演示数据:

test3.xlsx

2.png

import pandas as pd

import numpy as np

data1=pd.read_excel(r"D:\python课程\数据清洗(5)\pandas\test3.xlsx")

4.png


#用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缺失值使用吧。





'''


总结发现。

  1. 如果一个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中又会是另一番情景,不同的人和不同的数据、

软件版本操作可能得到的结果又不一样。

9.png

可以说缺失值在python里面算是一个比较神奇的存在,我们不要太纠结这些,只要是知道无论哪种格式,都会被缺失值检测函数检查出来就可以了。

添加CDA认证专家【维克多阿涛】,微信号:【cdashijiazhuang】,提供数据分析指导及CDA考试秘籍。已助千人通过CDA数字化人才认证。欢迎交流,共同成长!
0.0000 1 0 关注作者 收藏

评论(0)


暂无数据

推荐课程

推荐帖子