class_docstr: A ColumnChooser can apply custom transformations to different columns.
  The ColumnChooser accepts a list of tuples for the transformations,
  and will name the steps accordingly (because of the TruncableSteps' constructor)
  by converting each indexer object to a string. Indexer objects can be ranges, an int, or a list of ints.
  The input data can be `N`-dimensionnal (ND), in which case the axis must be specified. The columns
  data passed to the sub-steps will still be ND.
  
  Usage example:
  
  .. code-block:: python
  
      ColumnChooser([
          (range(0, 2), CyclicTimes()),
          (3, CategoricalEnum(categories_count=5, starts_at_zero=True)),
          (4, CategoricalEnum(categories_count=5, starts_at_zero=True)),
          ([10, 13, 15], CategoricalEnum(categories_count=5, starts_at_zero=True)),
      ])
  
  .. seealso::
      :class:`~neuraxle.union.FeatureUnion`,
class_docstr_tok: ["A","ColumnChooser","can","apply","custom","transformations","to","different","columns",".","The","ColumnChooser","accepts","a","list","of","tuples","for","the","transformations",",","and","will","name","the","steps","accordingly","(","because","of","the","TruncableSteps","'","constructor",")","by","converting","each","indexer","object","to","a","string",".","Indexer","objects","can","be","ranges",",","an","int",",","or","a","list","of","ints",".","The","input","data","can","be","`","N","`","-dimensionnal","(","ND",")",",","in","which","case","the","axis","must","be","specified",".","The","columns","data","passed","to","the","sub-steps","will","still","be","ND",".","Usage","example",":","..","code-block",":",":","python","ColumnChooser","(","[","(","range","(","0",",","2",")",",","CyclicTimes","(",")",")",",","(","3",",","CategoricalEnum","(","categories_count=5",",","starts_at_zero=True",")",")",",","(","4",",","CategoricalEnum","(","categories_count=5",",","starts_at_zero=True",")",")",",","(","[","10",",","13",",","15","]",",","CategoricalEnum","(","categories_count=5",",","starts_at_zero=True",")",")",",","]",")","..","seealso",":",":",":","class",":","`","~neuraxle.union.FeatureUnion","`",","]
code: def __init__(
      self,
      column_chooser_steps_as_tuple: ColumnChooserTupleList,
      n_dimension: int = 3,
      n_jobs=None,
      joiner: BaseTransformer = None,
  ):
      # Make unique names from the indices in case we have many steps for transforming the same column(s).
      self.string_indices = [
          str(name) + "_" + str(step.__class__.__name__)
          for name, step in column_chooser_steps_as_tuple
      ]
  
      FeatureUnion.__init__(
          self,
          [
              (
                  string_indices,
                  Pipeline(
                      [
                          ColumnsSelectorND(
                              indices, n_dimension=n_dimension
                          ),
                          step,
                      ]
                  ),
              )
              for string_indices, (indices, step) in zip(
                  self.string_indices, column_chooser_steps_as_tuple
              )
          ],
          n_jobs=n_jobs,
          joiner=joiner,
      )
  
imports: from operator import itemgetter
  from typing import List, Tuple, Union, Iterable
  import numpy
  from neuraxle.base import MetaStep, BaseTransformer
  from neuraxle.pipeline import Pipeline
  from neuraxle.steps.loop import ForEach
  from neuraxle.union import FeatureUnion
label_desc: Use image node_id 1 to create a new ColumnTransformer object from inherited base classes: FeatureUnion with example: obj = ColumnTransformer(column_chooser_steps_as_tuple, n_dimension, n_jobs, joiner)