code: def concat(data_list: Union[SingleData], axis=0) -> MultiData:
      """concat all SingleData by index.
      TODO: now just for SingleData.
  
      Parameters
      ----------
      data_list : List[SingleData]
          the list of all SingleData to concat.
  
      Returns
      -------
      MultiData
          the MultiData with ndim == 2
      """
      if axis == 0:
          raise NotImplementedError(
              f"please implement this func when axis == 0"
          )
      elif axis == 1:
          # get all index and row
          all_index = set()
          for index_data in data_list:
              all_index = all_index | set(index_data.index)
          all_index = list(all_index)
          all_index.sort()
          all_index_map = dict(zip(all_index, range(len(all_index))))
  
          # concat all
          tmp_data = np.full((len(all_index), len(data_list)), np.NaN)
          for data_id, index_data in enumerate(data_list):
              assert isinstance(index_data, SingleData)
              now_data_map = [
                  all_index_map[index] for index in index_data.index
              ]
              tmp_data[now_data_map, data_id] = index_data.data
          return MultiData(tmp_data, all_index)
      else:
          raise ValueError(f"axis must be 0 or 1")
  
imports: from __future__ import annotations
  from typing import Dict, Tuple, Union, Callable, List
  import bisect
  import numpy
  import pandas
label_desc: Use image node_id 1 for calling a global function with example usage: concat(data_list, axis) and returns: MultiData