tft每日頭條

 > 科技

 > 數據結構中null怎麼定義

數據結構中null怎麼定義

科技 更新时间:2025-02-01 16:59:26

上一篇文章,老海分享了關于Pyhon類和對象的白話理解

本篇我想分享一下 空值:None、NULL 與 空字符: “” 的區别和聯系

具體的實驗環境為Python3.7、mysql8.0、Excel2016

數據結構中null怎麼定義(數據清洗中的深坑)1

為什麼需要搞清楚None、NULL和空字符“”?

其實,無論作為數據分析、數據科學工作者,還是日常職場人士處理數據時

我們經常需要将數據在Python、SQL數據庫、CSV/EXCEL文件之間來回導出導入

而數據天生就是混亂的,複雜的,總是伴随着異常值和特殊值

所以出現這三個特殊值的情況,在所難免,有時甚至同時出現在同一組數據當中。

數據結構中null怎麼定義(數據清洗中的深坑)2

加之三者在不同環境下比如python、mysql、excel中,理解角度和設計邏輯各有不同,

往往會造成這些數據,在數據處理中前後不一緻、各種奇怪BUG報錯發生。

因此對于它們,我們處理時一定要特别小心,盡量避免後續數據存儲和計算出現麻煩!

下面老海從三個角度來解釋一下:

一張圖看透,None、NULL、空字符在Python、SQL、EXCEL中的整體規則

具體規則見下圖:

數據結構中null怎麼定義(數據清洗中的深坑)3

一張圖直觀解釋

網上關于它們的解釋說法很多,說實話有些眼花缭亂了。

我自己整理一個簡化的表格,這樣看起來直觀多了。

注意三點:

  • pandas中時間型數據的空值,顯示為NaT,含義與NaN相同
  • Exel中的空值表示,就是空,沒有什麼特别字符來表達
  • NULL隻出現在數據庫數據中,Python中沒有這個東西!

下面我們通過具體的數據案例來實驗一下:

從excel、mysql數據庫對比來看

我們先看一下None、NULL和空字符“”在Excel與數據庫之間切換時是如何變化的

首先在excel中原始數據如下:

數據結構中null怎麼定義(數據清洗中的深坑)4

存儲在xlsx中,excel2016版本

數據結構中null怎麼定義(數據清洗中的深坑)5

其中,性别字段包括了一個空字符、一個空值;年齡字段包括了一個空字符、一個空值

其次,将excel數據導入到mysql中

數據結構中null怎麼定義(數據清洗中的深坑)6

可以發現excel中的空值,在數據庫中顯示Null

數據結構中null怎麼定義(數據清洗中的深坑)7

而空字符顯示為空白,空數值顯示為0(與數據庫設置有關)

然後,我們把從數據庫導出數據到CSV中

數據結構中null怎麼定義(數據清洗中的深坑)8

我們可以發現從數據庫到CSV中,NULL顯示為空,其他沒有變化

加入Python、pandas後再來看一下

首先,看看Python中空值表達

數據結構中null怎麼定義(數據清洗中的深坑)9

None、NaN、空字符“”,它們看似都是表達空值含義,而實際上它們都有各自不同的數據類型

None是一個空值,即空對象,它Python裡一個特殊的值

None不能理解為0,因為0是有意義的;而None是一個特殊的空值,None不是空字符串。

而NaN,是pandas和numpy的專屬類型,屬于浮點型數據,代表缺失值

而“”,是空字符的表示。

再次,Python中沒有看到NULL

數據結構中null怎麼定義(數據清洗中的深坑)10

事實是,null 和 NULL 表示數據庫中的空值, python中不存在它們這個對象!

可能很多資料把NULL也寫進了Python解釋說明中,這個就真的有些說不過去了

如果直接将xlsx文件讀取到pandas中

數據結構中null怎麼定義(數據清洗中的深坑)11

我們發現excel中的空值和空字符,都轉為了NaN缺失值的表達!注意此時并沒有出現None空值對象

如果從pandas導出到xlsx文件中

數據結構中null怎麼定義(數據清洗中的深坑)12

數據結構中null怎麼定義(數據清洗中的深坑)13

我們可以看出pandas中的NaN,在excel中顯示為空,沒有任何内容。

那Python中數據轉為pandas會發生什麼?

數據結構中null怎麼定義(數據清洗中的深坑)14

Python中的None被轉為numpy中的NaN了,不再以None顯示

數據結構中null怎麼定義(數據清洗中的深坑)15

Python中的空字符“”,轉為pandas後統一顯示為 ''

将數據庫中導出CSV,讀取到pandas後會怎樣?

數據結構中null怎麼定義(數據清洗中的深坑)16

數據庫中的空值和空字符,均顯示為NaN

直連數據庫,讀取到python後會怎樣?

數據結構中null怎麼定義(數據清洗中的深坑)17

數據庫中NULL,全部在pandas中顯示為None;而空字符沒有變化還是"

那pandas對數據庫讀取的數據有怎麼樣的轉化規則?

數據結構中null怎麼定義(數據清洗中的深坑)18

pandas會将數據庫中數值型字段中的None轉為NaN,但是其他類型字段會保留None

同時pandas在進行count計算是,不計算None和NaN,但計算空字符"

而進行sum計算時,會同時排除掉NaN和None。

pandas中如何判斷空值類型,又如何轉化None和NaN呢?

數據結構中null怎麼定義(數據清洗中的深坑)19

一般我們可以借助,isnull()和isna()來直接進行判斷,它們會将None和NaN都識别為空值含義。

數據結構中null怎麼定義(數據清洗中的深坑)20

而pandas中很多函數并不支持None的運算,因為盡量将None轉換為NaN。

OK,折騰了半天,實驗就到這裡了,總體來說,區别它們還是很費心力的,而且還有很多複雜的情況存在,以及個别特殊情況的需要處理。這裡老海就不在一一展開了。

總之,在實際使用中,老海建議遵守三個法則,來保證特殊值一緻性

數據結構中null怎麼定義(數據清洗中的深坑)21

法則1:在導取數據後,我們第一時間把空字符替換為None、NaN或者NULL

法則2:在使用pandas或者numpy時,我們将None統一替換為NaN

法則3:在數據導入數據庫時,我們将NaN統一替換為None

以上法則,也是根據日常處理特殊值經驗而來,不一定适用于所有情況,優點是簡單直接便于記憶,也可盡量避免後期出現數據轉換帶來的困擾。

OK,今天就到這裡。喜歡老海的分享,請關注留言和轉發,我是數據煉金師,老海

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved