code: def merge_dataset_features_values(
      self, features_dataset, targets_dataset, dataset_type, args
  ):
      dataset_joint = (
          features_dataset.to_ddf()
          .merge(targets_dataset.to_ddf(), on=INDEX_TMP_COL)
          .drop(INDEX_TMP_COL, axis=1)
      )
  
      if args.persist_intermediate_files:
          dataset_joint = self.persist_intermediate(
              dataset_joint, f"_cache/03/{dataset_type}/"
          )
  
      schema_joint = (
          features_dataset.schema + targets_dataset.schema
      ).excluding_by_name([INDEX_TMP_COL])
  
      dataset_joint = nvt.Dataset(
          dataset_joint,
          schema=schema_joint,
          cpu=not self.gpu,
      )
  
      return dataset_joint
  
imports: import gc
  import logging
  import os
  import shutil
  from functools import reduce
  from typing import Optional
  import nvtabular
  from merlin.core.dispatch import HAS_GPU
  from merlin.schema import Tags
  from nvtabular import ops
  from .args_parsing import parse_arguments
label_desc: Use image node_id 10 for calling the PreprocessingRunner obj's underlying member method code with example usage: obj.merge_dataset_features_values(features_dataset, targets_dataset, dataset_type, args) and returns: dataset_joint