• python 值比较判断,np.nan is np.nan 却 np.nan != np.nan ,pandas 单个数据框/单元格 值判断nan


    pandas中DataFrame,Series 都有 isnull()方法,而数据框/单元格却没有,用了就会报错:AttributeError: 'float' object has no attribute 'isnull'

      怎么判断单个框是否为 np.nan?

    索引一个单元格,用 is 判断

    pd.ix[60009,u'团队'] is np.nan

    ===========================================

    Python常规的判断,==,和is, 这对None是有效的

      None is None
      Out[49]: True

      None == None
      Out[50]: True

     ==========================================

      而对,np.nan,只能用is

    da1pd.ix[6000996,u'团队'] == np.nan
    Out[41]: False

    da1pd.ix[6000996,u'团队'] is np.nan

    Out[42]: True

    np.nan == np.nan
    Out[43]: False

     ==================================

      np.nan也不是None

    None == np.nan
    Out[46]: False

    None is np.nan
    Out[48]: False

     is 、== 的判断方法不同,is 判断是否为同一个对象

      1 is 1
      Out[51]: True

    而’== ’ 是值判断,两个变量值是否相等。

      u = 156

      v = 156

      u is v
      Out[58]: True

    #因为,Python,对变量赋值是用的引用,默认传的是地址,所以,赋的是同一个 对象,也会是 同一个对象

      u = 156.0

      u is v
      Out[60]: False

      u == v
      Out[61]: True

    # 一个赋值整数,一个赋值浮点数时就 不指向一个对象了。 只是值相等而已

    #注意:当数字过大时,超过256时也是不同的对象,因为数字过大解析器并没有保存

    a = 250
    a is 250
    Out[65]: True
    
    a = 257
    a is 257
    Out[67]: False
    
    a = 256
    a is 256
    Out[69]: True

    回到开始,np.nan 应该是没有值的,所以不能值判断,只用对象引用判断,而None有空值,所以也可以值判断。

    #补充之前的浅陋认识,np.nan 重载了“==” 运算符,dir(np.nan)就能看到"__eq__",翻了一下模块文件,没找到定义np.nan的源代码在哪.....

    #补充+1, 这次找到了,np.nan是在C:Program Files (x86)Anaconda2libsite-packages umpycore umeric.py 下引入的

           

         那个umath其实是 C:Program Files (x86)Anaconda2Libsite-packages umpycoreumath.pyd

          pyd 传说中的扩展包,numpy底层是C写的。。。

  • 相关阅读:
    java注解实例-反射生成sql
    应用服务器集群的伸缩性设计
    高可用的服务
    应用服务器集群Session管理
    应用服务器性能优化 (存储性能优化)
    应用服务器性能优化 (代码优化)
    应用服务器性能优化 (使用集群)
    应用服务器性能优化 (异步操作)
    应用服务器性能优化 (分布式缓存)
    Web前端性能优化(CDN加速及反向代理)
  • 原文地址:https://www.cnblogs.com/willowj/p/6553126.html
Copyright © 2020-2023  润新知