code: def _full_reduce(self, axis, map_func, reduce_func=None):
          
          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__"]
              )
docs: 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.