def _full_reduce(self, axis, map_func, reduce_func=None):
        """Apply function that will reduce the data to a Pandas Series.

        Args:
            axis: 0 for columns and 1 for rows. Default is 0.
            map_func: Callable function to map the dataframe.
            reduce_func: Callable function to reduce the dataframe. If none,
                then apply map_func twice.

        Return:
            A new QueryCompiler object containing the results from map_func and
            reduce_func.
        """
        if reduce_func is None:
            reduce_func = map_func

        mapped_parts = self.data.map_across_blocks(map_func)
        full_frame = mapped_parts.map_across_full_axis(axis, reduce_func)
        if axis == 0:
            columns = self.columns
            return self.__constructor__(
                full_frame, index=["__reduced__"], columns=columns
            )
        else:
            index = self.index
            return self.__constructor__(
                full_frame, index=index, columns=["__reduced__"]
            )
Apply function that will reduce the data to a Pandas Series.

        Args:
            axis: 0 for columns and 1 for rows. Default is 0.
            map_func: Callable function to map the dataframe.
            reduce_func: Callable function to reduce the dataframe. If none,
                then apply map_func twice.

        Return:
            A new QueryCompiler object containing the results from map_func and
            reduce_func.