上一篇文章,老海分享了关于Pyhon类和对象的白话理解
本篇我想分享一下 空值:None、NULL 与 空字符: “” 的区别和联系
具体的实验环境为Python3.7、mysql8.0、Excel2016
![90204cdd9b8a3f9debb97246af6a9e8c.png](https://i-blog.csdnimg.cn/blog_migrate/68e36cb95f313d8fa76742dd9d1021cd.jpeg)
为什么需要搞清楚None、NULL和空字符“”?
其实,无论作为数据分析、数据科学工作者,还是日常职场人士处理数据时
我们经常需要将数据在Python、SQL数据库、CSV/EXCEL文件之间来回导出导入
而数据天生就是混乱的,复杂的,总是伴随着异常值和特殊值。
所以出现这三个特殊值的情况,在所难免,有时甚至同时出现在同一组数据当中。
![9cd2bf831f51b33a75edfed097911930.png](https://i-blog.csdnimg.cn/blog_migrate/570f30ee92f6a5801f8351e4eec40d7d.jpeg)
加之三者在不同环境下比如python、mysql、excel中,理解角度和设计逻辑各有不同,
往往会造成这些数据,在数据处理中前后不一致、各种奇怪BUG报错发生。
因此对于它们,我们处理时一定要特别小心,尽量避免后续数据存储和计算出现麻烦!
下面老海从三个角度来解释一下:
一张图看透,None、NULL、空字符在Python、SQL、EXCEL中的整体规则
具体规则见下图:
![8f3ebc9aee405d701107d1ae97d4cdae.png](https://i-blog.csdnimg.cn/blog_migrate/ed1479610c3b561edf7ede3ff49d3233.jpeg)
一张图直观解释
网上关于它们的解释说法很多,说实话有些眼花缭乱了。
我自己整理一个简化的表格,这样看起来直观多了。
注意三点:
- pandas中时间型数据的空值,显示为NaT,含义与NaN相同
- Exel中的空值表示,就是空,没有什么特别字符来表达
- NULL只出现在数据库数据中,Python中没有这个东西!
下面我们通过具体的数据案例来实验一下:
从excel、mysql数据库对比来看
我们先看一下None、NULL和空字符“”在Excel与数据库之间切换时是如何变化的
首先在excel中原始数据如下:
![00e463612f04b209f3f5154454d271ac.png](https://i-blog.csdnimg.cn/blog_migrate/76fe9f9aef2632233f6f1734be5a107d.jpeg)
存储在xlsx中,excel2016版本
![961d4b3074c2c3544f637fc413a94d01.png](https://i-blog.csdnimg.cn/blog_migrate/e3911f35a827bf8ab4df836af594bed9.jpeg)
其中,性别字段包括了一个空字符、一个空值;年龄字段包括了一个空字符、一个空值
其次,将excel数据导入到mysql中
![3abe31845fa882397cee1f912f12e2fd.png](https://i-blog.csdnimg.cn/blog_migrate/fd9948c530a8f6c33948a3223e3d7b43.jpeg)
可以发现excel中的空值,在数据库中显示Null
![de6e61d1a0bcc19b79212c4a07154265.png](https://i-blog.csdnimg.cn/blog_migrate/637e3a0cb777b15c73296078457344af.jpeg)
而空字符显示为空白,空数值显示为0(与数据库设置有关)
然后,我们把从数据库导出数据到CSV中
![37dbd4a5649b891ee7a1546d38361a1b.png](https://i-blog.csdnimg.cn/blog_migrate/2b5ceb6b085ba6d2bd8c82fb7a8bcdef.jpeg)
我们可以发现从数据库到CSV中,NULL显示为空,其他没有变化
加入Python、pandas后再来看一下
首先,看看Python中空值表达
![5c5b04444179dc36b482f14fd64b8c99.png](https://i-blog.csdnimg.cn/blog_migrate/85faca7f9d685ea62e52e62f188103ec.jpeg)
None、NaN、空字符“”,它们看似都是表达空值含义,而实际上它们都有各自不同的数据类型
None是一个空值,即空对象,它Python里一个特殊的值
None不能理解为0,因为0是有意义的;而None是一个特殊的空值,None不是空字符串。
而NaN,是pandas和numpy的专属类型,属于浮点型数据,代表缺失值
而“”,是空字符的表示。
再次,Python中没有看到NULL
![55c3ae286998c5d770f2175dd029fd6f.png](https://i-blog.csdnimg.cn/blog_migrate/2e51ceccdba7820ab6789ef1366a03af.jpeg)
事实是,null 和 NULL 表示数据库中的空值, python中不存在它们这个对象!
可能很多资料把NULL也写进了Python解释说明中,这个就真的有些说不过去了
如果直接将xlsx文件读取到pandas中
![7d30954e59bf62fa2c2fd68c761a0fe7.png](https://i-blog.csdnimg.cn/blog_migrate/3a7cb3190246902c178a9916b4f6e8a7.jpeg)
我们发现excel中的空值和空字符,都转为了NaN缺失值的表达!注意此时并没有出现None空值对象
如果从pandas导出到xlsx文件中
![5940a11e72edac6fa0b129096fcd2db5.png](https://i-blog.csdnimg.cn/blog_migrate/eaf4d0a376ad1da5f99d16a542f8ed24.jpeg)
![a694eb8dd3574403ca8b49fb81108abe.png](https://i-blog.csdnimg.cn/blog_migrate/2a39e22ad2beb78485c7e7dd40407690.jpeg)
我们可以看出pandas中的NaN,在excel中显示为空,没有任何内容。
那Python中数据转为pandas会发生什么?
![8e27a25d96f4afffbb4df97c7fdaf2c1.png](https://i-blog.csdnimg.cn/blog_migrate/e270fc727ba0f05e792dedbdd042f552.jpeg)
Python中的None被转为numpy中的NaN了,不再以None显示
![72fc054f57e2c7dff183ed8563301e07.png](https://i-blog.csdnimg.cn/blog_migrate/0ee12f885532819f68329d654cce177f.jpeg)
Python中的空字符“”,转为pandas后统一显示为 ''
将数据库中导出CSV,读取到pandas后会怎样?
![3155e4430629fbaab941fb07dfe7bded.png](https://i-blog.csdnimg.cn/blog_migrate/1cf34a943b160047e7c641e30319db18.jpeg)
数据库中的空值和空字符,均显示为NaN
直连数据库,读取到python后会怎样?
![6dea3fd293295e1a5e8c81b36836d0c0.png](https://i-blog.csdnimg.cn/blog_migrate/9b3ed0fca07b142ee62e5cc2cd041841.jpeg)
数据库中NULL,全部在pandas中显示为None;而空字符没有变化还是"
那pandas对数据库读取的数据有怎么样的转化规则?
![3f0a25ca6eb0eeb20ec1b349e8fdde3a.png](https://i-blog.csdnimg.cn/blog_migrate/f4ddc3155cedc2f2fbbf4cce5c1adc90.jpeg)
pandas会将数据库中数值型字段中的None转为NaN,但是其他类型字段会保留None
同时pandas在进行count计算是,不计算None和NaN,但计算空字符"
而进行sum计算时,会同时排除掉NaN和None。
pandas中如何判断空值类型,又如何转化None和NaN呢?
![1995f7796aff33c8c171ba6f9a66f15e.png](https://i-blog.csdnimg.cn/blog_migrate/c0c432e0af26e81637526523c7176afd.jpeg)
一般我们可以借助,isnull()和isna()来直接进行判断,它们会将None和NaN都识别为空值含义。
![e32862d6aa8fac3dd4da5363cb15f198.png](https://i-blog.csdnimg.cn/blog_migrate/563be849d7aaf781492d1177c802aac8.jpeg)
而pandas中很多函数并不支持None的运算,因为尽量将None转换为NaN。
OK,折腾了半天,实验就到这里了,总体来说,区别它们还是很费心力的,而且还有很多复杂的情况存在,以及个别特殊情况的需要处理。这里老海就不在一一展开了。
总之,在实际使用中,老海建议遵守三个法则,来保证特殊值一致性
![0c3c604c7550da7f75c02114791d2846.png](https://i-blog.csdnimg.cn/blog_migrate/aba517dc58f2705b3599b4b14c7f8045.jpeg)
法则1:在导取数据后,我们第一时间把空字符替换为None、NaN或者NULL
法则2:在使用pandas或者numpy时,我们将None统一替换为NaN
法则3:在数据导入数据库时,我们将NaN统一替换为None
以上法则,也是根据日常处理特殊值经验而来,不一定适用于所有情况,优点是简单直接便于记忆,也可尽量避免后期出现数据转换带来的困扰。
OK,今天就到这里。喜欢老海的分享,请关注留言和转发,我是数据炼金师,老海