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

In [2]:
import numpy as np
import pandas as pd
In [3]:
pd.notnull('cow')
Out[3]:
True
In [4]:
pd.notnull(np.nan)
Out[4]:
False

ndarrays result in an ndarray of booleans.

In [5]:
array = np.array([[2, np.nan, 3], [5, 6, np.nan]])
array
Out[5]:
array([[ 2., nan,  3.],
       [ 5.,  6., nan]])
In [6]:
pd.notnull(array)
Out[6]:
array([[ True, False,  True],
       [ True,  True, False]])

For indexes, an ndarray of booleans is returned.

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

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

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