【问题标题】:Numpy/Pandas clean way to check if a specific value is NaNNumpy/Pandas 检查特定值是否为 NaN 的干净方法
【发布时间】:2021-09-16 20:34:34
【问题描述】:

如何检查给定值是否为 NaN?

例如if (a == np.NaN)(不起作用)

请注意:

  • Numpy 的 isnan 方法会抛出字符串等数据类型的错误
  • Pandas 文档仅提供删除包含 NaN 的行的方法,或检查 DataFrame 是否/何时包含 NaN 的方法。我在询问是否检查特定值是否为 NaN。
  • 相关的 Stackoverflow 问题和 Google 搜索结果似乎是关于检查“如果任何值是 NaN”或“DataFrame 中有哪些值”

必须有一种干净的方法来检查给定值是否为 NaN?

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    您可以使用 NaN != NaN 的固有属性

    如果aNaN,那么a == a 将返回False

    这甚至适用于字符串

    例子:

    In[52]:
    s = pd.Series([1, np.NaN, '', 1.0])
    s
    
    Out[52]: 
    0      1
    1    NaN
    2       
    3      1
    dtype: object
    
    
    for val in s:
        print(val==val)
    True
    False
    True
    True
    

    这可以通过矢量化方式完成:

    In[54]:
    s==s
    
    Out[54]: 
    0     True
    1    False
    2     True
    3     True
    dtype: bool
    

    但您仍然可以在整个系列中使用方法isnull

    In[55]:
    s.isnull()
    
    Out[55]: 
    0    False
    1     True
    2    False
    3    False
    dtype: bool
    

    更新

    正如@piRSquared 所指出的,如果您比较None==None,这将返回True,但pd.isnull 将返回True,因此取决于您是否要将None 视为NaN,您仍然可以使用@987654337 @ 用于比较或pd.isnull 如果您想将None 视为NaN

    【讨论】:

    • 需要注意的是,Pandas isnull 会将 None 视为空值。但是,None == None 的计算结果为 True。这与NaN 的行为不同。所以如果a = np.array([None, np.nan]) 并且我们评估了a == a,我们会得到array([True, False])
    • @piRSquared 你使用的是什么版本的 numpy,pandas,python,因为我没有看到这一点,如果这是真的,你在调用 b.isnull() 时不会得到相同的结果吗答案不是我观察到的
    • @piRSquared 我正在运行 python 3.6.0、numpy 1.11.3 和 pandas 0.22.0
    • @piRSquared 我确实同意None==None,但由于某种原因我没有注意到这一点
    • 熊猫 0.22,numpy 1.14,python 3.6。 a = np.array([None, np.nan]); print(a == a, pd.isna(a), sep='\n\n')
    【解决方案2】:

    Pandas 有 isnullnotnullisnanotna

    这些函数适用于数组或标量。


    设置

    a = np.array([[1, np.nan],
                  [None, '2']])
    

    熊猫函数

    pd.isna(a)
    # same as
    # pd.isnull(a)
    
    array([[False,  True],
           [ True, False]])
    

    pd.notnull(a)
    # same as
    # pd.notna(a)
    
    array([[ True, False],
           [False,  True]])
    

    DataFrame(或Series)方法

    b = pd.DataFrame(a)
    

    b.isnull()
    # same as
    # b.isna()
    
           0      1
    0  False   True
    1   True  False
    

    b.notna()
    # same as
    # b.notnull()
    
           0      1
    0   True  False
    1  False   True
    

    【讨论】:

    • 不知道isna 对我来说不清楚,除了少输入与isnull 的不同之处
    • @EdChum 我认为没有,除了少了 2 个字符。
    • 貌似是在0.21.0中添加的,是为了保持一致,可能是我没注意到的原因
    • 谢谢,isnull 似乎适用于单个值。顺便说一句,我问的是检查特定值而不检查 Series/DataFrame 中的所有值。
    猜你喜欢
    • 2014-10-26
    • 2020-02-27
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2013-09-12
    • 2017-01-10
    • 2015-03-01
    • 2015-06-14
    相关资源
    最近更新 更多