code: def map_across_full_axis(self, axis, map_func):
          
          # Since we are already splitting the DataFrame back up after an
          # operation, we will just use this time to compute the number of
          # partitions as best we can right now.
          num_splits = self._compute_num_partitions()
          preprocessed_map_func = self.preprocess_func(map_func)
          partitions = self.column_partitions if not axis else self.row_partitions
          # For mapping across the entire axis, we don't maintain partitioning because we
          # may want to line to partitioning up with another BlockPartitions object. Since
          # we don't need to maintain the partitioning, this gives us the opportunity to
          # load-balance the data as well.
          result_blocks = np.array(
              [
                  part.apply(preprocessed_map_func, num_splits=num_splits)
                  for part in partitions
              ]
          )
          # If we are mapping over columns, they are returned to use the same as
          # rows, so we need to transpose the returned 2D numpy array to return
          # the structure to the correct order.
          return (
              self.__constructor__(result_blocks.T)
              if not axis
              else self.__constructor__(result_blocks)
          )
docs: Applies `map_func` to every partition.
  
          Note: This method should be used in the case that `map_func` relies on
              some global information about the axis.
  
          Args:
              axis: The axis to perform the map across (0 - index, 1 - columns).
              map_func: The function to apply.
  
          Returns:
              A new BaseFrameManager object, the type of object that called this.