如果列不同于NaN或0,则使用np.any()替代

时间:2018-10-10 11:35:53

标签: python pandas numpy nan

我想检查数据帧中的列是否包含不同于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

谢谢你, R

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

先反转isin然后求和

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

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