code: def _transform(self, df):
      ucols = [self.partition_key, self.input_col]
  
      input_col = self.input_col
      output_col = self.output_col
      vocab_df = self._vocab_df
  
      return (
          df.join(vocab_df, on=ucols, how="left_outer")
          .withColumn(
              output_col,
              f.when(
                  f.col(output_col).isNotNull(), f.col(output_col)
              ).otherwise(
                  f.lit(0),
              ),
          )
          .drop(input_col)
      )
  
imports: from typing import List
  from synapse.ml.cyber.utils.spark_utils import DataFrameUtils, ExplainBuilder, HasSetInputCol, HasSetOutputCol
  from pyspark.ml import Estimator, Transformer
  from pyspark.ml.param.shared import HasInputCol, HasOutputCol, Param, Params
  from pyspark.sql import DataFrame, functions
label_desc: Use image node_id 3 for calling the IdIndexerModel obj's underlying member method code with example usage: obj._transform(df) and returns: df