Feature request: Allow `how` and `subset` arguments for `DataFrame.isna()` and `notna()`
Something like this would be very useful, and would be consistent with the arguments of `DataFrame.dropna()`
```
def isna(df, how='any', subset: Collection[str] = ()) -> pd.Series:
    """
    Like DataFrame.isna(), but allows `how` and `subset` arguments
    """
    if not subset:
        subset = df.columns
    elif not (isinstance(subset, Collection) and not isinstance(subset, str)):
        subset = (subset, )
    if how == 'any':
        op = np.logical_or
    elif how == 'all':
        op = np.logical_and
    else:
        raise ValueError(f"`how={how}` not one of 'any', 'all'")
    return op.reduce([df[col].isna() for col in subset])


def notna(df, how='any', subset: Collection[str] = ()) -> pd.Series:
    """
    Like DataFrame.isna(), but allows `how` and `subset` arguments
    """
    if not subset:
        subset = df.columns
    elif not (isinstance(subset, Collection) and not isinstance(subset, str)):
        subset = (subset, )
    if how == 'any':
        op = np.logical_or
    elif how == 'all':
        op = np.logical_and
    else:
        raise ValueError(f"`how={how}` not one of 'any', 'all'")
    return op.reduce([df[col].notna() for col in subset])
```