code: def apply(self, func, num_splits=None, other_axis_partition=None, **kwargs):
          
          if num_splits is None:
              num_splits = len(self.list_of_blocks)
  
          if other_axis_partition is not None:
              return [
                  PyarrowOnRayFramePartition(obj)
                  for obj in deploy_ray_func_between_two_axis_partitions._remote(
                      args=(self.axis, func, num_splits, len(self.list_of_blocks), kwargs)
                      + tuple(self.list_of_blocks + other_axis_partition.list_of_blocks),
                      num_return_vals=num_splits,
                  )
              ]
  
          args = [self.axis, func, num_splits, kwargs]
          args.extend(self.list_of_blocks)
          return [
              PyarrowOnRayFramePartition(obj)
              for obj in deploy_ray_axis_func._remote(args, num_return_vals=num_splits)
          ]
docs: Applies func to the object in the plasma store.
  
          See notes in Parent class about this method.
  
          Args:
              func: The function to apply.
              num_splits: The number of times to split the result object.
              other_axis_partition: Another `PyarrowOnRayFrameAxisPartition` object to apply to
                  func with this one.
  
          Returns:
              A list of `RayRemotePartition` objects.