def _average(expression, probes, *args, **kwargs):
    """
    Averages expression data for probes representing the same gene

    Parameters
    ----------
    expression : list of (P, S) pandas.DataFrame
        Each dataframe should have `P` rows representing probes and `S` columns
        representing distinct samples, with values indicating microarray
        expression levels
    probes : pandas.DataFrame
        Dataframe containing information on probes that should be considered in
        representative analysis. Generally, intensity-based-filtering (i.e.,
        `probe_ibf()`) should have been used to reduce this list to only those
        probes with good expression signal

    Returns
    -------
    representative : list of (S, G) pandas.DataFrame
        Dataframes with rows representing `S` distinct samples and columns
        representing `G` unique genes, with values indicating microarray
        expression levels for each combination of samples and genes
    """

    def _avg(df):
        return df.join(probes['gene_symbol'], on='probe_id') \
                 .groupby('gene_symbol') \
                 .mean()

    return [_avg(exp) for exp in expression]