code: def relabel(self, label=None, group=None, depth=0):
          
          new_data = self.data
          if (depth > 0) and getattr(self, '_deep_indexable', False):
              new_data = []
              for k, v in self.data.items():
                  relabelled = v.relabel(group=group, label=label, depth=depth-1)
                  new_data.append((k, relabelled))
          keywords = [('label', label), ('group', group)]
          kwargs = {k: v for k, v in keywords if v is not None}
          return self.clone(new_data, **kwargs)
docs: Clone object and apply new group and/or label.
  
          Applies relabeling to children up to the supplied depth.
  
          Args:
              label (str, optional): New label to apply to returned object
              group (str, optional): New group to apply to returned object
              depth (int, optional): Depth to which relabel will be applied
                  If applied to container allows applying relabeling to
                  contained objects up to the specified depth
  
          Returns:
              Returns relabelled object