Examples
Scalar arguments (including strings) result in a scalar boolean.

In [1]:
import numpy as np
import pandas as pd
In [2]:
pd.notna('cat')
Out[2]:
True
In [3]:
pd.notna(np.nan)
Out[3]:
False

ndarrays result in an ndarray of booleans.

In [4]:
array = np.array([[3, np.nan, 4], [6, 7, np.nan]])
array
Out[4]:
array([[ 3., nan,  4.],
       [ 6.,  7., nan]])
In [5]:
pd.notna(array)
Out[5]:
array([[ True, False,  True],
       [ True,  True, False]])

For indexes, an ndarray of booleans is returned.

In [6]:
index = pd.DatetimeIndex(["2019-05-02", "2019-05-04", None,
                          "2019-05-07"])
index
Out[6]:
DatetimeIndex(['2019-05-02', '2019-05-04', 'NaT', '2019-05-07'], dtype='datetime64[ns]', freq=None)
In [7]:
pd.notna(index)
Out[7]:
array([ True,  True, False,  True])

For Series and DataFrame, the same type is returned, containing booleans.

In [8]:
df = pd.DataFrame([['fox', 'bee', 'lion'], ['cat', None, 'fly']])
df
Out[8]:
0 1 2
0 fox bee lion
1 cat None fly
In [9]:
pd.notna(df)
Out[9]:
0 1 2
0 True True True
1 True False True
In [10]:
pd.notna(df[1])
Out[10]:
0     True
1    False
Name: 1, dtype: bool