def df_without_columns(df, cols_to_remove):
    """
    Returns a copy of the input dataframe, without specified columns. 

    :param df: the input DataFrame
    :param cols_to_remove: list or set of columns to remove
    :return: a copy of the input dataframe, without specified columns.
    """
    df_sub = df[list(set(df.columns.values.tolist()) - set(cols_to_remove))]
    return df_sub.copy()