code: def droplevel(self, level=0):
          
          if not isinstance(level, (tuple, list)):
              level = [level]
  
          levnums = sorted(self._get_level_number(lev) for lev in level)[::-1]
  
          if len(level) == 0:
              return self
          if len(level) >= self.nlevels:
              raise ValueError("Cannot remove {} levels from an index with {} "
                               "levels: at least one level must be "
                               "left.".format(len(level), self.nlevels))
          # The two checks above guarantee that here self is a MultiIndex
  
          new_levels = list(self.levels)
          new_codes = list(self.codes)
          new_names = list(self.names)
  
          for i in levnums:
              new_levels.pop(i)
              new_codes.pop(i)
              new_names.pop(i)
  
          if len(new_levels) == 1:
  
              # set nan if needed
              mask = new_codes[0] == -1
              result = new_levels[0].take(new_codes[0])
              if mask.any():
                  result = result.putmask(mask, np.nan)
  
              result.name = new_names[0]
              return result
          else:
              from .multi import MultiIndex
              return MultiIndex(levels=new_levels, codes=new_codes,
                                names=new_names, verify_integrity=False)
docs: Return index with requested level(s) removed.
  
          If resulting index has only 1 level left, the result will be
          of Index type, not MultiIndex.
  
          .. versionadded:: 0.23.1 (support for non-MultiIndex)
  
          Parameters
          ----------
          level : int, str, or list-like, default 0
              If a string is given, must be the name of a level
              If list-like, elements must be names or indexes of levels.
  
          Returns
          -------
          Index or MultiIndex