code: def fit(self, ctx: Context, train_data_list):
      sample_id_name_list = [
          data.schema.sample_id_name for data in train_data_list
      ]
      if sum(
          [
              name != sample_id_name_list[0]
              for name in sample_id_name_list
          ]
      ):
          raise ValueError(
              f"Data sets should all have the same sample_id_name for union."
          )
  
      match_id_name_list = [
          data.schema.match_id_name for data in train_data_list
      ]
      if sum(
          [name != match_id_name_list[0] for name in match_id_name_list]
      ):
          raise ValueError(
              f"Data sets should all have the same match_id_name for union."
          )
  
      if self.axis == 0:
          label_name_list = [
              data.schema.label_name for data in train_data_list
          ]
          if sum(
              [name != label_name_list[0] for name in label_name_list]
          ):
              raise ValueError(
                  f"Data sets should all have the same label_name for union."
              )
  
          column_name_list = [
              set(data.schema.columns) for data in train_data_list
          ]
          if sum(
              [
                  col_names != column_name_list[0]
                  for col_names in column_name_list
              ]
          ):
              raise ValueError(
                  f"Data sets should all have the same columns for union on 0 axis."
              )
          result_data = DataFrame.vstack(train_data_list)
          return result_data
      else:
          raise ValueError(f"axis must be 0, but got {self.axis}")
  
file_path: FATE/python/fate/ml/preprocessing/union.py
imports: import logging
  from fate.arch import Context
  from fate.arch.dataframe import DataFrame
  from ..abc.module import Module
label_desc: Use image node_id 2 for calling the Union obj's underlying member method code with example usage: obj.fit(ctx, train_data_list) and returns: result_data