def subset_adata(adata, subset, verbose=True):
    """
    Subsets AnnData object on one or more .obs columns

    Columns should contain 0/False for cells to throw out, and 1/True for cells to 
    keep. Keeps union of all labels provided in subset.

    Parameters
    ----------

    adata : anndata.AnnData
        the data
    subset : str or list of str
        adata.obs labels to use for subsetting. Labels must be binary (0, "0", False, 
        "False" to toss - 1, "1", True, "True" to keep). Multiple labels will keep 
        intersection.
    verbose : bool, optional (default=True)
        print updates to console

    Returns
    -------

    adata : anndata.AnnData
        new anndata object as subset of `adata`
    """
    if verbose:
        print("Subsetting AnnData on {}".format(subset), end="")
    if isinstance(subset, str):
        subset = [subset]
    # initialize .obs column for choosing cells
    adata.obs["adata_subset_combined"] = 0
    # create label as union of given subset args
    for i in range(len(subset)):
        adata.obs.loc[
            adata.obs[subset[i]].isin(["True", True, 1.0, 1]), "adata_subset_combined"
        ] = 1
    adata = adata[adata.obs["adata_subset_combined"] == 1, :].copy()
    adata.obs.drop(columns="adata_subset_combined", inplace=True)
    if verbose:
        print(" - now {} cells and {} genes".format(adata.n_obs, adata.n_vars))
    return adata