def verify_df_series(df, func, *args, columns=None, rows=None, axis=0, how=
    'all', **kwargs):
    """
    Verify that ``df.agg(func, axis, *args, **kwargs)`` are ``True``.

    Parameters
    ==========
    df : DataFrame
    func : callable, string or dictionary of callables.
        Callables should take df, *args, and **kwargs as arguments and
        return a bool.
    columns: str, list, slice object etc.
        Same as allowed for df.loc
    rows : str, list, slice object etc.
        Same as allowed for df.loc
    axis : int
        Axis 0 or axis 1.
    how: str
        ``'all'`` means the check is only passed if all column checks evaluate to True.
        ``'any'`` means the check is passed if any column check evaluates to True.

    Returns
    =======
    df : DataFrame
        same as the input.
    """
    rows, columns = rows or slice(None), columns or slice(None)
    check_df = df.loc[rows, columns]
    result_df = check_df.agg(func, axis, *args, **kwargs)
    if how == 'all':
        result = result_df.all()
    elif how == 'any':
        result = result_df.any()
    else:
        msg = "Parameter 'how' must be either 'all' or 'any', was {!r}"
        raise ValueError(msg.format(how))
    if axis == 0:
        msg = "These columns don't pass the validation: {!r}"
    else:
        msg = "These rows don't pass the validation: {!r}"
    not_passed_cols = result_df[result_df == False].index.tolist()
    assert result, msg.format(not_passed_cols)
    return df
