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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:numpy 学习汇总39- 翻转数组( 初步学习 tcy)
下一篇:numpy 学习汇总18.2 - 字符char操作( 基础学习 tcy)

发表评论

最新留言

逛到本站,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
自从我学会了数据挖掘Matplotlib、Numpy、Pandas、Ta-Lib等一系列库,我把领导开除了 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
ElasticSearch与Mysql对比(ElasticSearch常用方法大全,持续更新) 2019-04-29
数字化转型的主干道上,华为云以“三大关键”成企业智能化推手 2019-04-29
数字化为何不走“捷”“径”? 2019-04-29
和总裁、专家交朋友,华为云助推政企智能化升级又做到前面去了 2019-04-29
BCOP章鱼船长,6月22日晚上8点上线薄饼 2019-04-29
为战疫助力,半导体功不可没 2019-04-29