code: def shuffle(self, func, lengths, **kwargs):
          
          num_splits = len(lengths)
          # We add these to kwargs and will pop them off before performing the operation.
          kwargs["manual_partition"] = True
          kwargs["_lengths"] = lengths
          args = [self.axis, func, num_splits, kwargs, False]
          args.extend(self.list_of_blocks)
          return self._wrap_partitions(self.deploy_axis_func(*args))
docs: Shuffle the order of the data in this axis based on the `lengths`.
  
          Extends `BaseFrameAxisPartition.shuffle`.
  
          Args:
              func: The function to apply before splitting.
              lengths: The list of partition lengths to split the result into.
  
          Returns:
              A list of RemotePartition objects split by `lengths`.