Альтернатива np.any (), если столбец отличается от NaN или 0

1

Я хочу проверить, содержит ли столбец в 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

Теги:
pandas
numpy
nan

2 ответа

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
    В качестве альтернативы, вместо ~numpy.isnan() я бы использовал numpy.isfinite с пониманием того, что можно также отбрасывать бесконечные значения.
  • 0
    @AGNGazer - Спасибо, добавили в ответ.
Показать ещё 1 комментарий
0

инвертирует тогда сумму

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

или же

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню