【问题标题】:np.any() alternative if column is different than NaN or 0如果列不同于 NaN 或 0,则 np.any() 替代
【发布时间】:2019-03-15 07:30:21
【问题描述】:

我想检查 Dataframe 中的列是否包含不同于 0 或 NaN 的值。 因此我尝试了 np.any() 但如果列中只有 NaN 和 0 它也会返回 true。

np.any([0 , np.NaN, 0])
True

获得这样的输出的最佳方法是什么:(列的类型是 float64)

df = [0 , np.NaN, 18, 0]
True

df = [0, np.NaN, 0]
False

谢谢, 回复

【问题讨论】:

    标签: python pandas numpy nan


    【解决方案1】:

    fillna 替换缺失值并检查:

    print (pd.Series([0 , np.NaN, 18, 0]).fillna(0).any())
    True
    
    print (pd.Series([0 , np.NaN, 0]).fillna(0).any())
    False
    

    或者通过dropna删除它们:

    print (pd.Series([0 , np.NaN, 18, 0]).dropna().any())
    True
    
    print (pd.Series([0 , np.NaN, 0]).dropna().any())
    False
    

    Numpy 解决方案 - 通过使用 numpy.isnan 和索引进行索引来删除缺失值:

    def checkNaN_or_0(arr):
        m = ~np.isnan(arr)
        return np.any(np.array(arr)[m])
    
    print (checkNaN_or_0([0, np.NaN, 18, 0]))
    True
    
    print (checkNaN_or_0([0, np.NaN, 0]))
    False
    

    感谢@AGN Gazer 也可以使用np.inf 值:

    def checkNaN_or_0(arr):
        m = np.isfinite(arr)
        return np.any(np.array(arr)[m])
    
    print (checkNaN_or_0([0, np.NaN, 18, 0, np.inf]))
    True
    
    print (checkNaN_or_0([0, np.NaN, 0, np.inf]))
    False
    

    【讨论】:

    • 或者,我会使用 numpy.isfinite 而不是 ~numpy.isnan(),但要知道删除无限值也是可以的。
    • @AGNGazer - 谢谢,已添加到答案中。
    • @AGNGazer - 我有点惊讶,但现在明白了。谢谢。
    【解决方案2】:

    反相然后求和

    (~df['column name'].isin([0, np.nan])).sum() > 0
    

    any(~df['column name'].isin([0, np.nan]))
    

    【讨论】:

      猜你喜欢
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 2021-12-18
      • 2018-03-12
      • 2020-11-04
      相关资源
      最近更新 更多