code: def inter_data_operation(self, axis, func, other):
          
          if axis:
              partitions = self.row_partitions
              other_partitions = other.row_partitions
          else:
              partitions = self.column_partitions
              other_partitions = other.column_partitions
          func = self.preprocess_func(func)
          result = np.array(
              [
                  partitions[i].apply(
                      func,
                      num_splits=self._compute_num_partitions(),
                      other_axis_partition=other_partitions[i],
                  )
                  for i in range(len(partitions))
              ]
          )
          return self.__constructor__(result) if axis else self.__constructor__(result.T)
docs: Apply a function that requires two BaseFrameManager objects.
  
          Args:
              axis: The axis to apply the function over (0 - rows, 1 - columns)
              func: The function to apply
              other: The other BaseFrameManager object to apply func to.
  
          Returns:
              A new BaseFrameManager object, the type of object that called this.