numpy 学习汇总38- 缺失数据,数据异常,NaN& None的区别( 初步学习 tcy)
发布日期:2021-06-29 14:47:51
浏览次数:3
分类:技术文章
本文共 9693 字,大约阅读时间需要 32 分钟。
NumPy:怎么处理缺失的数字 2018/11/29 ===================================================================# 1.np.genfromtx 函数有一个 missing_values 参数默认把缺失数字转为np.nana = np.genfromtxt('./example.csv', delimiter=',')a=np.array([[1,2,3,4],[5,6,np.nan,8]]) # 2.判断一个值是否缺失np.isnan(np.nan)#Truenp.isnan(a) # array([[False, False, False, False],[False, False, True, False]]) # 3.计算缺失数据的个数np.count_nonzero(np.isnan(a))#1 # 4.如果要计算有效数据数:np.count_nonzero(~np.isnan(a))#7 # 5.计算包含 NaN 数组的总和sumnp.nansum(a, axis=0)#array([ 6., 8., 3., 12.]) # 6.移除所有有数据缺失的行a[~np.isnan(a).any(1)]# array([[1., 2., 3., 4.]]) # 7.把丢失的值转为0a0 = np.nan_to_num(a)# array([[ 1., 2., 3., 4.],[ 5., 6., 0., 8.]]) # 8.把特定数值改为NaNa0[a0==0] = -7a0# array([[ 1., 2., 3., 4.], [ 5., 6., -7., 8.]]) # 9.移除所有NaN值a[~np.isnan(a)]#array([1., 2., 3., 4., 5., 6., 8.]) ====================================================================
numpy如何处理数值异常 2018/11/23
数据异常处理:· ignore'忽略': 发生异常时不采取任何行动。· warn' 警告 ' : 打印一个 RuntimeWarning(通过Python warnings模块)。· 'raise': 引发FloatingPointError。· 'call': 调用使用seterrcall函数指定的函数。· 'log': 直接打印警告stdout。· 'log': 在由seterrcall指定的Log对象中记录错误。针对各种错误或特定的错误进行设置:· all全部: 适用于所有数字例外· invalid无效: 生成NaN时· divide除以零(对于整数也是!)· overflow溢出: 浮点溢出· underflow下溢:浮点下溢
# 注意,除数为零的整数由同一机器处理。这些行为是基于每个线程设置的。 示例
>>> oldsettings = np.seterr(all='warn')>>> np.zeros(5,dtype=np.float32)/0.# invalid value encountered in divide>>> j = np.seterr(under='ignore')>>> np.array([1.e-100])**10>>> j = np.seterr(invalid='raise')>>> np.sqrt(np.array([-1.]))# FloatingPointError: invalid value encountered in sqrt>>> def errorhandler(errstr, errflag):... print("saw stupid error!")>>> np.seterrcall(errorhandler)#>>> j = np.seterr(all='call')>>> np.zeros(5, dtype=np.int32)/0# FloatingPointError: invalid value encountered in divide# saw stupid error!>>> j = np.seterr(**oldsettings) # restore previous... # error-handling settings
错误处理
通用函数可以跳出硬件中的特殊浮点状态寄存器(例如除以零)。如果在您的平台上可用,这些寄存器将在计算过程中定期检查。错误处理以每个线程为基础进行控制,并且可以使用这些功能进行配置seterr([all,divide,over,under,invalid]) 设置如何处理浮点错误。seterrcall(FUNC) 设置浮点错误回调函数或日志对象
maskedarray:处理(传播)缺失数据
# 对于花式,人们可以使用NaN,但是面具适用于所有类型:x = np.ma.array([1, 2, 3, 4], mask=[0, 1, 0, 1])x# masked_array(data = [1 -- 3 --],mask = [False True False True],fill_value = 999999)y = np.ma.array([1, 2, 3, 4], mask=[0, 1, 1, 1])x + y# masked_array(data = [2 -- -- --],mask = [False True True True],fill_value = 999999)# Masking versions of common functions:np.ma.sqrt([1, -1, 2, -2])# masked_array(data = [1.0 -- 1.41421356237... --],mask = [False True False True],fill_value = 1e+20)
Python 中 NaN 和 None 的详细比较 2018/11/9#=====================================================================# python原生的None和numpy.NaN用来标示空缺数据。from numpy import NaNfrom pandas import Series, DataFrameimport numpy as np#1.数据类型type(None) #NoneTypetype(NaN) # float#能作为dict的key{None:1, NaN:2} # {nan: 2, None: 1}#=====================================================================2.Series函数中的表现# 2.1.Series.maps = Series([None, NaN, 'a']) # None,NaN, a dtype: objects.map({None:1,'a':'a'}) # 1,1, a dtype: objects.map({NaN:1,'a':'a'}) # 1,1, a dtype: objects.map({NaN:2,'None':1,'a':'a'}) # 2,2, a dtype: objects.map({'None':1,NaN:2,'a':'a'}) # 2,2, a dtype: object#=====================================================================# 2.2.Series.replace中的表现s = Series([None, NaN, 'a'])#s.replace([NaN],9) # 9,9, a dtype: objects.replace([None],9) # 9,9, a dtype: object=====================================================================# 2.3.对函数的支持#np.nansum([1,2,NaN]) # 3.0np.sum([1,2,np.NaN]) #nan## 但是None不能享受这些函数的便利,如果数据包含的None的话会报错# try:# np.nansum([1,2,None])# except Exception as e:# print(type(e),e)## pandas中也有不少函数支持NaN却不支持None。(毕竟pandas的底层是numpy)pd.cut(Series([NaN]),[1,2])# 0 NaN# dtype: category# Categories (1, object): [(1, 2]]## try:# pd.cut(Series([None]),[1,2])# except Exception as e:# print(type(e),e)=====================================================================3.对容器数据类型的影响## 3.1混入numpy.array的影响# 如果数据中含有None,会导致整个array的类型变成object。np.array([1, None]).dtype # dtype('O')# 而np.NaN尽管会将原本用int类型就能保存的数据转型成float,但不会带来上面这个问题。np.array([1, NaN]).dtype # dtype('float64')#=====================================================================# 3.2.混入Series的影响Series([1, NaN])# 0 1.0# 1 NaN# dtype: float64#Series([1, None]) # pandas将None自动替换成了NaN!# 0 1.0# 1 NaN# dtype: float64# -------------------------------------------# 不过如果本来Series就只能用object类型容纳的话, Series不会做这样的转化工作。Series(['a', None])# 0 a# 1 None# dtype: object## 如果Series里面都是None的话也不会做这样的转化Series([None,None])# 0 None# 1 None# dtype: object## 其它的数据类型是bool时,也不会做这样的转化。Series([True, False, None])# 0 True# 1 False# 2 None# dtype: object=====================================================================4.等值性判断4.1.单值的等值性比较# 下面的实验中None和NaN的表现会作为后面的等值性判断的基准None == None # TrueNaN == NaN # FalseNone == NaN # False=====================================================================4.2.在tuple中的情况(1, None) == (1, None) # True(1, None) == (1, NaN) # False## 但是下面这个实验NaN的表现和基准不一致(1, NaN) == (1, NaN) # True=====================================================================4.3.在numpy.array中的情况np.array([1,None]) == np.array([1,None])# array([ True, True], dtype=bool)np.array([1,NaN]) == np.array([1,NaN]) # array([ True, False], dtype=bool)np.array([1,NaN]) == np.array([1,None]) # array([ True, False], dtype=bool)## 希望左右两边的array被判定成一致。用numpy.testing.assert_equal函数。 表现同assert,# 不会返回True, False, 而是无反应或者raise Exceptionnp.testing.assert_equal(np.array([1,NaN]), np.array([1,NaN]))np.testing.assert_equal(np.array([1,None]), np.array([1,None]))## 一边是None,一边是NaN时会被认为两边不一致, 导致AssertionError# try:# np.testing.assert_equal(np.array([1,NaN]), np.array([1,None]))# except Exception as e:# print(type(e),e)=====================================================================4.4.在Series中的情况Series([NaN,'a']) == Series([NaN,'a'])# 0 False# 1 True# dtype: boolSeries([None,'a']) == Series([NaN,'a'])# 0 False# 1 True# dtype: bool# 但是None和基准的表现不一致Series([None,'a']) == Series([None,'a'])## 0 False# 1 True# dtype: bool## 和array类似,Series也有专门的函数equals用于判断两边的Series是否整体看相等Series([None,'a']).equals(Series([NaN,'a'])) # TrueSeries([None,'a']).equals(Series([None,'a']))# TrueSeries([NaN,'a']).equals(Series([NaN,'a'])) # True# 比numpy.testing.assert_equals更智能些, 三种情况下都能恰当的处理=====================================================================4.5.在DataFrame merge中的表现# 两边的None会被判为相同a = DataFrame({'A':[None,'a']})b = DataFrame({'A':[None,'a']})a.merge(b,on='A', how = 'outer')# A# 0 None# 1 a# 两边的NaN会被判为相同a = DataFrame({'A':[NaN,'a']})b = DataFrame({'A':[NaN,'a']})a.merge(b,on='A', how = 'outer')# A# 0 NaN# 1 a## 两边都是None,都是NaN,相关列会被正确匹配。 一边None,一边NaN时以左侧结果为准。a = DataFrame({'A':[None,'a']})b = DataFrame({'A':[NaN,'a']})a.merge(b,on='A', how = 'outer')# A# 0 None# 1 aa = DataFrame({'A':[NaN,'a']})b = DataFrame({'A':[None,'a']})a.merge(b,on='A', how = 'outer')# A# 0 NaN# 1 a注意# 这和空值在postgresql等sql数据库中的表现不一样, 在数据库中, join时两边的空值会被判定为不同的数值=====================================================================4.6.在groupby中的表现d = DataFrame({'A':[1,1,1,1,2],'B':[NaN,NaN,'a','a','b']})d.groupby(['A','B']).apply(len)# A B# 1 a 2# 2 b 1# dtype: int64# 可以看到(1, NaN)对应的组直接被忽略了#d = DataFrame({'A':[1,1,1,1,2],'B':[None,None,'a','a','b']})d.groupby(['A','B']).apply(len)# A B# 1 a 2# 2 b 1# dtype: int64# (1,None)的组也被直接忽略了# d = DataFrame({'A':[1,1,1,1,2],'B':[None,NaN,'a','a','b']})d.groupby(['A','B']).apply(len)# A B# 1 a 2# 2 b 1# dtype: int64# 总结DataFrame.groupby会忽略分组列中含有None或者NaN的记录=====================================================================5.支持写入数据库往数据库中写入时NaN不可处理,需转换成None,否则会报错。s = Series([None,NaN,'a'])# 0 None# 1 NaN# 2 a# dtype: object方案1s.replace([NaN],None)# 0 None# 1 None# 2 a# dtype: object方案2s[s.isnull()]=None# 0 None# 1 None# 2 a# dtype: objects = Series([NaN,1])# 0 NaN# 1 1.0# dtype: float64s.replace([NaN], None)# 0 NaN# 1 1.0# dtype: float64s[s.isnull()] = None# 0 NaN# 1 1.0# dtype: float64当其他数据是int或float时,Series又一声不吭的自动把None替换成了NaN。这时候可以使用第三种方法处理s.where(s.notnull(), None)# 0 None# 1 1# dtype: objectwhere语句会遍历s中所有的元素,逐一检查条件表达式, 如果成立, 从原来的s取元素; 否则用None填充。 这回没有自动替换成NaN=====================================================================None vs NaN要点总结1) 在pandas中如其他数据都是数值类型pandas把None替换成NaN, 甚至能将s[s.isnull()]= None,和s.replace(NaN, None)操作无效化。 需用where函数进行替换。# 2) None能够直接被导入数据库作为空值处理, 包含NaN数据导入时会报错。3) numpy和pandas很多函数能处理NaN,遇到None就会报错。4) None和NaN都不能被pandas的groupby函数处理,含None或NaN组都会被忽略。5)等值性比较的总结:(True表示被判定为相等)
类别 None对None NaN对NaN None对NaN 单值 True False False tuple(整体) True 'True' False np.array(逐个) True False False Series(逐个) 'False' False False assert_equals True 'True' False Series.equals True 'True' 'True' merge True 'True' 'True' 等值性比较None和NaN在各场景下表现不太一致,相对来说None表现的更稳定。
建议遵循以下三个原则: 1) 在用pandas和numpy处理数据阶段将None,NaN统一处理成NaN,以便支持更多的函数。 2) 判断Series,numpy.array整体等值性用Series.equals,numpy.array函数,不用==判断 3) 将数据导入数据库,将NaN替换成None=====================================================================
转载地址:https://chunyou.blog.csdn.net/article/details/84642578 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月06日 15时41分47秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
效率提升法则:高效人士不会去做的4件事
2019-04-29
8.PostgreSQL约束
2019-04-29
【技术分享】使用AES加密技术保障数据安全
2019-04-29
【应用实例】布线多?成本高?不可靠?泽耀方案没烦恼!
2019-04-29
数据可视化工具:Matplotlib绘图
2019-04-29
用Python写个超级小恐龙跑酷游戏,上班摸鱼我能玩一天
2019-04-29
闺蜜看我用Python画了一幅樱花图,吵着要我给他介绍程序员小哥哥
2019-04-29
【Python爬虫实战】知乎热榜数据采集,上班工作摸鱼两不误,知乎热门信息一网打尽
2019-04-29
Python抓取哔哩哔哩up主信息:只要爬虫学的好,牢饭吃的早
2019-04-29
有个码龄5年的程序员跟我说:“他连wifi从来不用密码”
2019-04-29
领导让我整理上个季度的销售额,幸好我会Python数据分析,你猜我几点下班
2019-04-29
【Python爬虫实战】为何如此痴迷Python?还不是因为爱看小姐姐图
2019-04-29
零基础自学Python,你也可以实现经济独立!
2019-04-29
数字化转型的主干道上,华为云以“三大关键”成企业智能化推手
2019-04-29
数字化为何不走“捷”“径”?
2019-04-29
和总裁、专家交朋友,华为云助推政企智能化升级又做到前面去了
2019-04-29
BCOP章鱼船长,6月22日晚上8点上线薄饼
2019-04-29
为战疫助力,半导体功不可没
2019-04-29