В Pandas и Numpy есть векторизованные функции, такие как np.isnan
, np.isinf
и pd.isnull
, чтобы проверить, являются ли элементы массива, серии или фрейма данных различными видами отсутствующими / нулевыми / недействительными.
Они работают на скалярах. pd.isnull(None)
просто возвращает True
вместо pd.Series([True])
, что удобно.
Но скажем, я хочу знать, является ли любой объект одним из этих нулевых значений; Вы не можете сделать это ни с одной из этих функций! Это потому, что они с радостью будут векторизовать различные структуры данных. Неосторожное их использование неизбежно приведет к страшной ошибке «Истина серии неоднозначна».
Мне нужна такая функция:
assert not is_scalar_null(3)
assert not is_scalar_null([1,2])
assert not is_scalar_null([None, 1])
assert not is_scalar_null(pd.Series([None, 1]))
assert not is_scalar_null(pd.Series([None, None]))
assert is_scalar_null(None)
assert is_scalar_null(np.nan)
Внутренне, функция Pandas pandas._lib.missing.checknull
будет делать правильные вещи:
import pandas._libs.missing as libmissing
libmissing.checknull(pd.Series([1,2])) # correctly returns False
Но обычно это плохая практика; согласно соглашению об именах Python, _lib
является приватным. Я также не уверен насчет эквивалентов Numpy.
Есть ли "приемлемый", но официальный способ использовать ту же логику проверки нуля, что и NumPy и Pandas, но строго для скаляров?