code: def _id_var(x, drop=False):
      
      if len(x) == 0:
          return []
  
      categorical = pdtypes.is_categorical_dtype(x)
  
      if categorical:
          if drop:
              x = x.cat.remove_unused_categories()
              lst = list(x.cat.codes + 1)
          else:
              has_nan = any(np.isnan(i) for i in x if isinstance(i, float))
              if has_nan:
                  # NaNs are -1, we give them the highest code
                  nan_code = -1
                  new_nan_code = np.max(x.cat.codes) + 1
                  lst = [val if val != nan_code else new_nan_code for val in x]
              else:
                  lst = list(x.cat.codes + 1)
      else:
          try:
              levels = np.sort(np.unique(x))
          except TypeError:
              # x probably has NANs
              levels = multitype_sort(set(x))
  
          lst = match(x, levels)
          lst = [item + 1 for item in lst]
  
      return lst
docs: Assign ids to items in x. If two items
      are the same, they get the same id.
  
      Parameters
      ----------
      x : array-like
          items to associate ids with
      drop : bool
          Whether to drop unused factor levels