code: def _concat_grid(cls, grid, axes, output_type):
      if output_type == OutputType.tensor:
          return cls._concat_tensor_grid(grid, axes)
      elif output_type == OutputType.dataframe:
          return cls._concat_dataframe_grid(grid, axes)
      else:
          assert output_type == OutputType.series
          return cls._concat_series_grid(grid, axes)
  
imports: import itertools
  from collections import defaultdict
  from collections.abc import Iterable
  from functools import reduce
  import numpy
  import pandas
  from ...None import opcodes
  from ...core import get_output_types, recursive_tile
  from ...core.operand import OperandStage, MapReduceOperand
  from ...dataframe.utils import parse_index
  from ...lib import sparse
  from ...serialization.serializables import FieldTypes, TupleField, KeyField
  from ...tensor.utils import validate_axis, check_random_state, gen_random_seeds, decide_unify_split
  from ...tensor.array_utils import get_array_module
  from ...utils import tokenize, lazy_import, has_unknown_shape
  from ...core import ExecutableTuple
  from ..operands import LearnOperandMixin, OutputType, LearnShuffleProxy
  from ..utils import convert_to_tensor_or_dataframe
label_desc: Use image node_id 18 for calling the LearnShuffle obj's underlying member method code with example usage: obj._concat_grid(cls, grid, axes, output_type) and returns: cls, cls, cls