class_docstr: Apply a transformer columnwise to multivariate series.
  
  Overview: input multivariate time series and the transformer passed
  in `transformer` parameter is applied to specified `columns`, each
  column is handled as a univariate series. The resulting transformed
  data has the same shape as input data.
  
  Parameters
  ----------
  transformer : Estimator
      scikit-learn-like or sktime-like transformer to fit and apply to series.
  columns : list of str or None
          Names of columns that are supposed to be transformed.
          If None, all columns are transformed.
  
  Attributes
  ----------
  transformers_ : dict of {str : transformer}
      Maps columns to transformers.
  columns_ : list of str
      Names of columns that are supposed to be transformed.
  
  See Also
  --------
  OptionalPassthrough
  
  Examples
  --------
  >>> from sktime.datasets import load_longley
  >>> from sktime.transformations.series.detrend import Detrender
  >>> from sktime.transformations.compose import ColumnwiseTransformer
  >>> _, X = load_longley()
  >>> transformer = ColumnwiseTransformer(Detrender())
  >>> Xt = transformer.fit_transform(X)
docstr: Transform X and return a transformed version.
  
  private _transform containing the core logic, called from transform
  
  Returns a transformed version of X by iterating over specified
  columns and applying the wrapped transformer to them.
  
  Parameters
  ----------
  X : pd.DataFrame
      Data to be transformed
  y : Series or Panel, default=None
      Additional data, e.g., labels for transformation
  
  Returns
  -------
  Xt : pd.DataFrame
      transformed version of X
docstr_tok: ["Transform","X","and","return","a","transformed","version",".","private","_transform","containing","the","core","logic",",","called","from","transform","Returns","a","transformed","version","of","X","by","iterating","over","specified","columns","and","applying","the","wrapped","transformer","to","them",".","Parameters","--","--","--","--","--","X",":","pd.DataFrame","Data","to","be","transformed","y",":","Series","or","Panel",",","default=None","Additional","data",",","e.g.",",","labels","for","transformation","Returns","--","--","--","-","Xt",":","pd.DataFrame","transformed","version","of","X"]
code: def _transform(self, X, y=None):
      """Transform X and return a transformed version.
  
      private _transform containing the core logic, called from transform
  
      Returns a transformed version of X by iterating over specified
      columns and applying the wrapped transformer to them.
  
      Parameters
      ----------
      X : pd.DataFrame
          Data to be transformed
      y : Series or Panel, default=None
          Additional data, e.g., labels for transformation
  
      Returns
      -------
      Xt : pd.DataFrame
          transformed version of X
      """
      # make copy of z
      X = X.copy()
  
      # make sure z contains all columns that the user wants to transform
      _check_columns(X, selected_columns=self.columns_)
      for colname in self.columns_:
          X[colname] = self.transformers_[colname].transform(
              X[colname], y
          )
      return X
  
imports: import pandas
  from sktime.base._meta import _ColumnEstimator, _HeterogenousMetaEstimator
  from sktime.transformations.base import BaseTransformer
  from sktime.utils.multiindex import rename_multiindex
  from sktime.utils.validation.series import check_series
label_desc: Use image node_id 3 for calling the ColumnwiseTransformer obj's underlying member method code with example usage: obj._transform(X, y) and returns: X