code: def _process_groupby_params(cls, groupby_params):
      new_groupby_params = groupby_params.copy()
      if isinstance(groupby_params["by"], list):
          by = []
          for v in groupby_params["by"]:
              if isinstance(v, ENTITY_TYPE):
                  by.append(cls.concat_tileable_chunks(v).chunks[0])
              else:
                  by.append(v)
          new_groupby_params["by"] = by
      return new_groupby_params
  
imports: from collections import OrderedDict
  from functools import reduce
  import numpy
  import pandas
  from ..core import FuseChunkData, FuseChunk, ENTITY_TYPE, OutputType
  from ..core.operand import Operand, TileableOperandMixin, Fuse, ShuffleProxy, FuseChunkMixin
  from ..tensor.core import TENSOR_TYPE
  from ..tensor.datasource import tensor
  from ..tensor.operands import TensorOperandMixin
  from ..utils import calc_nsplits
  from .core import DATAFRAME_CHUNK_TYPE, SERIES_CHUNK_TYPE, INDEX_CHUNK_TYPE, DATAFRAME_TYPE, SERIES_TYPE, INDEX_TYPE, DATAFRAME_GROUPBY_TYPE, SERIES_GROUPBY_TYPE, CATEGORICAL_TYPE
  from .utils import parse_index
label_desc: Use image node_id 12 for calling the DataFrameOperandMixin obj's underlying member method code with example usage: obj._process_groupby_params(cls, groupby_params) and returns: new_groupby_params