Альтернатива np.any (), если столбец отличается от NaN или 0 - PullRequest
0 голосов
/ 10 октября 2018

Я хочу проверить, содержит ли столбец в Dataframe значение, отличное от 0 или NaN.Поэтому я попытался np.any (), но он также возвращает true, если в столбце есть только NaN и 0.

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

Какой лучший способ получить вывод, подобный следующему: (тип столбца:float64)

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

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

Спасибо, R

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

инвертировать в сумме

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

или

any(~df['column name'].isin([0, np.nan]))
0 голосов
/ 10 октября 2018

Замените пропущенные значения на 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
...