Calculates an empirical spatial table

    Yields
    -------
    DataFrame
        Spatial table for each division. See Notes.

    Notes
    -----
    The spatial table is the precursor to the SAR, EAR, and grid-based
    commonality metrics. Each row in the table corresponds to a cell created by
    a given division. Columns are cell_loc (within the grid defined by the
    division), spp_set, n_spp, and n_individs.

def _yield_spatial_table(patch, div, spp_col, count_col, x_col, y_col):
    """
    Calculates an empirical spatial table

    Yields
    -------
    DataFrame
        Spatial table for each division. See Notes.

    Notes
    -----
    The spatial table is the precursor to the SAR, EAR, and grid-based
    commonality metrics. Each row in the table corresponds to a cell created by
    a given division. Columns are cell_loc (within the grid defined by the
    division), spp_set, n_spp, and n_individs.

    """

    # Catch error if you don't use ; after divs in comm_grid in MacroecoDesktop
    try:
        div_split_list = div.replace(';','').split(',')
    except AttributeError:
        div_split_list = str(div).strip("()").split(',')

    div_split = (x_col + ':' + div_split_list[0] + ';' +
                 y_col + ':' + div_split_list[1])

    # Get cell_locs
    # Requires _parse_splits and _product functions to go y inside of x
    x_starts, x_ends = _col_starts_ends(patch, x_col, div_split_list[0])
    x_offset = (x_ends[0] - x_starts[0]) / 2
    x_locs = x_starts + x_offset

    y_starts, y_ends = _col_starts_ends(patch, y_col, div_split_list[1])
    y_offset = (y_ends[0] - y_starts[0]) / 2
    y_locs = y_starts + y_offset

    cell_locs = _product(x_locs, y_locs)

    # Get spp set and count for all cells
    n_spp_list = [] # Number of species in cell
    n_individs_list = []
    spp_set_list = []   # Set object giving unique species IDs in cell
    for cellstring, cellpatch in _yield_subpatches(patch,div_split,name='div'):
        spp_set = set(np.unique(cellpatch.table[spp_col]))
        spp_set_list.append(spp_set)
        n_spp_list.append(len(spp_set))
        n_individs_list.append(np.sum(cellpatch.table[count_col]))

    # Create and return dataframe
    df = pd.DataFrame({'cell_loc': cell_locs, 'spp_set': spp_set_list,
                       'n_spp': n_spp_list, 'n_individs': n_individs_list})

    return df