上一篇文章,老海分享了關于Pyhon類和對象的白話理解
本篇我想分享一下 空值:None、NULL 與 空字符: “” 的區别和聯系
具體的實驗環境為Python3.7、mysql8.0、Excel2016
為什麼需要搞清楚None、NULL和空字符“”?
其實,無論作為數據分析、數據科學工作者,還是日常職場人士處理數據時
我們經常需要将數據在Python、SQL數據庫、CSV/EXCEL文件之間來回導出導入
而數據天生就是混亂的,複雜的,總是伴随着異常值和特殊值。
所以出現這三個特殊值的情況,在所難免,有時甚至同時出現在同一組數據當中。
加之三者在不同環境下比如python、mysql、excel中,理解角度和設計邏輯各有不同,
往往會造成這些數據,在數據處理中前後不一緻、各種奇怪BUG報錯發生。
因此對于它們,我們處理時一定要特别小心,盡量避免後續數據存儲和計算出現麻煩!
下面老海從三個角度來解釋一下:
一張圖看透,None、NULL、空字符在Python、SQL、EXCEL中的整體規則具體規則見下圖:
一張圖直觀解釋
網上關于它們的解釋說法很多,說實話有些眼花缭亂了。
我自己整理一個簡化的表格,這樣看起來直觀多了。
注意三點:
下面我們通過具體的數據案例來實驗一下:
從excel、mysql數據庫對比來看我們先看一下None、NULL和空字符“”在Excel與數據庫之間切換時是如何變化的
首先在excel中原始數據如下:
存儲在xlsx中,excel2016版本
其中,性别字段包括了一個空字符、一個空值;年齡字段包括了一個空字符、一個空值
其次,将excel數據導入到mysql中
可以發現excel中的空值,在數據庫中顯示Null
而空字符顯示為空白,空數值顯示為0(與數據庫設置有關)
然後,我們把從數據庫導出數據到CSV中
我們可以發現從數據庫到CSV中,NULL顯示為空,其他沒有變化
加入Python、pandas後再來看一下首先,看看Python中空值表達
None、NaN、空字符“”,它們看似都是表達空值含義,而實際上它們都有各自不同的數據類型
None是一個空值,即空對象,它Python裡一個特殊的值
None不能理解為0,因為0是有意義的;而None是一個特殊的空值,None不是空字符串。
而NaN,是pandas和numpy的專屬類型,屬于浮點型數據,代表缺失值
而“”,是空字符的表示。
再次,Python中沒有看到NULL
事實是,null 和 NULL 表示數據庫中的空值, python中不存在它們這個對象!
可能很多資料把NULL也寫進了Python解釋說明中,這個就真的有些說不過去了
如果直接将xlsx文件讀取到pandas中
我們發現excel中的空值和空字符,都轉為了NaN缺失值的表達!注意此時并沒有出現None空值對象
如果從pandas導出到xlsx文件中
我們可以看出pandas中的NaN,在excel中顯示為空,沒有任何内容。
那Python中數據轉為pandas會發生什麼?
Python中的None被轉為numpy中的NaN了,不再以None顯示
Python中的空字符“”,轉為pandas後統一顯示為 ''
将數據庫中導出CSV,讀取到pandas後會怎樣?
數據庫中的空值和空字符,均顯示為NaN
直連數據庫,讀取到python後會怎樣?
數據庫中NULL,全部在pandas中顯示為None;而空字符沒有變化還是"
那pandas對數據庫讀取的數據有怎麼樣的轉化規則?
pandas會将數據庫中數值型字段中的None轉為NaN,但是其他類型字段會保留None
同時pandas在進行count計算是,不計算None和NaN,但計算空字符"
而進行sum計算時,會同時排除掉NaN和None。
pandas中如何判斷空值類型,又如何轉化None和NaN呢?
一般我們可以借助,isnull()和isna()來直接進行判斷,它們會将None和NaN都識别為空值含義。
而pandas中很多函數并不支持None的運算,因為盡量将None轉換為NaN。
OK,折騰了半天,實驗就到這裡了,總體來說,區别它們還是很費心力的,而且還有很多複雜的情況存在,以及個别特殊情況的需要處理。這裡老海就不在一一展開了。
總之,在實際使用中,老海建議遵守三個法則,來保證特殊值一緻性
法則1:在導取數據後,我們第一時間把空字符替換為None、NaN或者NULL
法則2:在使用pandas或者numpy時,我們将None統一替換為NaN
法則3:在數據導入數據庫時,我們将NaN統一替換為None
以上法則,也是根據日常處理特殊值經驗而來,不一定适用于所有情況,優點是簡單直接便于記憶,也可盡量避免後期出現數據轉換帶來的困擾。
OK,今天就到這裡。喜歡老海的分享,請關注留言和轉發,我是數據煉金師,老海
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!