class_docstr: Numba extension type carrying metadata associated with a single
  GroupBy group. This metadata ultimately is passed to the CUDA
  __device__ function which actually performs the work.
class_docstr_tok: ["Numba","extension","type","carrying","metadata","associated","with","a","single","GroupBy","group",".","This","metadata","ultimately","is","passed","to","the","CUDA","__device__","function","which","actually","performs","the","work","."]
code: def __init__(self, group_scalar_type, index_type=index_default_type):
      if (
          group_scalar_type not in SUPPORTED_GROUPBY_NUMBA_TYPES
          and not isinstance(group_scalar_type, types.Poison)
      ):
          # A frame containing an column with an unsupported dtype
          # is calling groupby apply. Construct a GroupType with
          # a poisoned type so we can later error if this group is
          # used in the UDF body
          group_scalar_type = types.Poison(group_scalar_type)
      self.group_scalar_type = group_scalar_type
      self.index_type = index_type
      self.group_data_type = types.CPointer(group_scalar_type)
      self.group_size_type = group_size_type
      self.group_index_type = types.CPointer(index_type)
      super().__init__(
          name=f"Group({self.group_scalar_type}, {self.index_type})"
      )
  
imports: from typing import Any, Dict
  import numba
  from numba import cuda, types
  from numba.core.extending import make_attribute_wrapper, models, register_model, type_callable, typeof_impl
  from numba.core.typing import signature
  from numba.core.typing.templates import AbstractTemplate, AttributeTemplate
  from numba.cuda.cudadecl import registry
  from numba.np import numpy_support
  from cudf.core.udf._ops import arith_ops, comparison_ops, unary_ops
  from cudf.core.udf.utils import Row, UDFError
label_desc: Use image node_id 1 to create a new GroupType object from inherited base classes: numba.types with example: obj = GroupType(group_scalar_type, index_type)