學(xué)生:
老師,請(qǐng)教一下,為什么空值顯示有nan和NaN兩種?
nan是numpy.float64格式,NaN是float格式,兩者有什么不同嗎?
老師:
你可以認(rèn)為成沒有區(qū)別,只要確保你的變量的缺失值是float就可以了
具體一些細(xì)節(jié)嘗試如下:
演示數(shù)據(jù):
import pandas as pd
import numpy as np
data1=pd.read_excel(r"D:\python課程\數(shù)據(jù)清洗(5)\pandas\test3.xlsx")
#用spder導(dǎo)入數(shù)據(jù)之后,各個(gè)變量的類型是姓名:object,年齡:int64,身高:float64,體重:int64,性別:object
#
'''
身高列的缺失值在前臺(tái)顯示位nan,
data1.loc[2,"身高"]
Out[97]: nan
type(data1.loc[2,"身高"])
Out[99]: numpy.float64
性別列的缺失值在前臺(tái)顯示為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的類也是一樣的,但是執(zhí)行雙等號(hào)的比較,返回還是False
這是什么原因?qū)е碌哪兀?/p>
a1
Out[122]: nan
a2
Out[123]: nan
id(a1)
Out[124]: 226363152
id(a2)
Out[125]: 82576464
可以看到兩個(gè)float變量的id是不一樣的。也就是說缺失值不能算是一個(gè)常量。也就是用各種庫(kù)生成的缺失值并不是電腦中的唯一儲(chǔ)存地址
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類型轉(zhuǎn)化為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中進(jìn)行缺失值的判斷
我們就把他們當(dāng)作無差別的float缺失值使用吧。
'''
總結(jié)發(fā)現(xiàn)。
如果一個(gè)Series對(duì)象的dtype是float64,如果這個(gè)series里面有一個(gè)缺失值,
這個(gè)缺失值在前臺(tái)就會(huì)顯示為nan,單獨(dú)看這一個(gè)缺失值的類型,會(huì)發(fā)現(xiàn)是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.如果將前面的序列,轉(zhuǎn)化為類型為 Object類型,這個(gè)時(shí)候缺失值在前臺(tái)顯示為NaN。
單獨(dú)看這一個(gè)缺失值的類型,會(huì)發(fā)現(xiàn)是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.也就是當(dāng)你的列或者說變量的dtype不一樣的時(shí)候,缺失值的顯示格式是不一樣的,可能顯示為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中總結(jié)的規(guī)律,到了jupyter notebook中又會(huì)是另一番情景,不同的人和不同的數(shù)據(jù)、
軟件版本操作可能得到的結(jié)果又不一樣。
可以說缺失值在python里面算是一個(gè)比較神奇的存在,我們不要太糾結(jié)這些,只要是知道無論哪種格式,都會(huì)被缺失值檢測(cè)函數(shù)檢查出來就可以了。








暫無數(shù)據(jù)