Python-NaN和None有什么区别?

发布于 2021-02-02 23:12:40

我正在使用pandas读取csv文件的两列,readcsv()然后将值分配给字典。这些列包含数字和字母字符串。有时在某些情况下单元格为空。在我看来,应读取None但应nan分配该字典条目的值。当然None,由于它具有空值,因此更能描述一个空单元格,而nan只是说读取的值不是数字。

我的理解正确吗,None和之间有什么区别nan?为什么nan分配而不是None

另外,我的字典检查是否有任何空单元格一直在使用numpy.isnan()

for k, v in my_dict.iteritems():
    if np.isnan(v):

但这给了我一个错误,说我不能使用此检查v。我猜这是因为要使用整数或浮点变量,而不是字符串。如果是这样,如何检查v“空单元格” / nan大小写?

关注者
0
被浏览
99
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    在我看来,使用NaN(而不是None)的主要原因是它可以与numpy的float64 dtype一起存储,而不是效率较低的object dtype,请参阅NA type Promotions

    #  without forcing dtype it changes None to NaN!
    s_bad = pd.Series([1, None], dtype=object)
    s_good = pd.Series([1, np.nan])
    
    In [13]: s_bad.dtype
    Out[13]: dtype('O')
    
    In [14]: s_good.dtype
    Out[14]: dtype('float64')
    

    杰夫对此评论(如下):

    np.nan允许向量化操作;它是一个float值,而None根据定义,它强制对象类型,这基本上禁用了numpy中的所有效率。

    因此,快速重复3次:object ==badfloat == good

    说,许多操作在None vs NaN上仍然可以正常工作(但可能不受支持,即有时可能会产生令人惊讶的结果):

    In [15]: s_bad.sum()
    Out[15]: 1
    
    In [16]: s_good.sum()
    Out[16]: 1.0
    

    要回答第二个问题:
    你应该使用pd.isnull并pd.notnull测试丢失的数据(NaN)。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看