Как проверить, содержит ли Pandas / NumPy произвольный объект или IS NaT / NaN / Null - PullRequest
1 голос
/ 24 марта 2020

Я хочу проверить, является ли объект Pandas / содержит какое-либо значение Null / NaN / NaT, но у меня нет никакой информации заранее, является ли объект списком или одним единственным значением.

Я пытался

x = [1,2,3,pd.NaT]
if pd.notnull(x):
    ...

Но если объект x является списком, он возвращает ошибку этого значения (из-за возврата массива логических значений):

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

И если я это сделаю :

x = pd.NaT
if pd.notnull(x).any():
   ...

Возвращает эту ошибку, если я получаю единственное значение:

AttributeError: 'bool' object has no attribute 'any'

Какой самый чистый способ go в этом, который может работать с обоими списками, которые могут содержат NaN и сами NaN?

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Оберните x внутри списка и перейдите к pd.notna и цепочке any. Это работает, потому что pd.notna возвращает numpy ndarray. Следовательно, any на самом деле ndarray.any. При вызове numpy ndarray.any без параметра axis он проверит все измерения. Следовательно, он работает как для списка x, так и для одного значения x

x = [1,2,3,pd.NaT]

In [369]: pd.notna([x])
Out[369]: array([[ True,  True,  True, False]]) #it is 2d-array

In [370]: type(pd.notna([x]))
Out[370]: numpy.ndarray

In [373]: pd.notna([x]).any()  #`ndarray.any` checks on all dimensions of this 2d-array
Out[373]: True

In [374]: pd.notna([x]).all()  #`ndarray.all` checks on all dimensions of this 2d-array
Out[374]: False

Вкл. x является единственным pd.NaT

x = pd.NaT

In [377]: pd.notna([x])
Out[377]: array([False])  #it is 1d-array

In [378]: pd.notna([x]).any()
Out[378]: False

In [379]: pd.notna([x]).all()
Out[379]: False
0 голосов
/ 24 марта 2020

Если вам нужно только знать, является ли какое-либо значение в вашем фрейме данных NaN, тогда вы можете просто сделать

if df.isnull().any().any():
    # NaN present(s)
    do_something()
...