引用地址:http://www.huochai.mobi/p/d/6669256/
支持寫入數(shù)據(jù)庫
往數(shù)據(jù)庫中寫入時(shí)NaN不可處理千埃,需轉(zhuǎn)換成None,否則會報(bào)錯(cuò)咆畏。這個(gè)這里就不演示了灿意。
相信作為pandas老司機(jī)哄酝, 至少能想出兩種替換方法。
In[53]:
s=Series([None,NaN,'a'])
s
Out[53]:
0None
1NaN
2a
dtype:object
方案1
In[54]:
s.replace([NaN],None)
Out[54]:
0None
1None
2a
dtype:object
方案2
In[55]:
s[s.isnull()]=None
s
Out[55]:
0None
1None
2a
dtype:object
然而這么就覺得完事大吉的話就圖樣圖森破了瘟裸, 看下面的例子
In[56]:
s=Series([NaN,1])
s
Out[56]:
0NaN
11.0
dtype:float64
In[57]:
s.replace([NaN],None)
Out[57]:
0NaN
11.0
dtype:float64
In[58]:
s[s.isnull()]=None
s
Out[58]:
0NaN
11.0
dtype:float64
當(dāng)其他數(shù)據(jù)是int或float時(shí),Series又一聲不吭的自動(dòng)把None替換成了NaN。
這時(shí)候可以使用第三種方法處理
In[59]:
s.where(s.notnull(),None)
Out[59]:
0None
11
dtype:object
where語句會遍歷s中所有的元素诵竭,逐一檢查條件表達(dá)式话告, 如果成立, 從原來的s取元素卵慰; 否則用None填充沙郭。 這回沒有自動(dòng)替換成NaN
None vs NaN要點(diǎn)總結(jié)
在pandas中, 如果其他的數(shù)據(jù)都是數(shù)值類型裳朋, pandas會把None自動(dòng)替換成NaN, 甚至能將s[s.isnull()]= None,和s.replace(NaN, None)操作的效果無效化病线。 這時(shí)需要用where函數(shù)才能進(jìn)行替換。
None能夠直接被導(dǎo)入數(shù)據(jù)庫作為空值處理鲤嫡, 包含NaN的數(shù)據(jù)導(dǎo)入時(shí)會報(bào)錯(cuò)送挑。
numpy和pandas的很多函數(shù)能處理NaN,但是如果遇到None就會報(bào)錯(cuò)暖眼。
None和NaN都不能被pandas的groupby函數(shù)處理惕耕,包含None或者NaN的組都會被忽略。
等值性比較的總結(jié):(True表示被判定為相等)
None對NoneNaN對NaNNone對NaN
單值TrueFalseFalse
tuple(整體)TrueTrueFalse
np.array(逐個(gè))TrueFalseFalse
Series(逐個(gè))FalseFalseFalse
assert_equalsTrueTrueFalse
Series.equalsTrueTrueTrue
mergeTrueTrueTrue
由于等值性比較方面诫肠,None和NaN在各場景下表現(xiàn)不太一致司澎,相對來說None表現(xiàn)的更穩(wěn)定。
為了不給自己惹不必要的麻煩和額外的記憶負(fù)擔(dān)区赵。 實(shí)踐中惭缰,建議遵循以下三個(gè)原則即可
在用pandas和numpy處理數(shù)據(jù)階段將None,NaN統(tǒng)一處理成NaN,以便支持更多的函數(shù)。
如果要判斷Series,numpy.array整體的等值性笼才,用專門的Series.equals,numpy.array函數(shù)去處理漱受,不要自己用==判斷 *
如果要將數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫,將NaN替換成None