code: def split_iterable_as_unordered_iterable(self, values):
          
          from collections import defaultdict
          cache = defaultdict(list)
          count = self.count
          unique = self.unique
          key = (lambda i: unique[i]) if isinstance(unique, np.ndarray) else (lambda i: tuple(c[i] for c in unique))
          for i,v in zip(self.inverse, values):
              cache[i].append(v)
              if len(cache[i]) == count[i]:
                  yield key(i), cache.pop(i)
docs: Group iterable into iterables, without regard for the ordering of self.index.unique
          key-group tuples are yielded as soon as they are complete
  
          Parameters
          ----------
          values : iterable of length equal to keys
              iterable of values to be grouped
  
          Yields
          ------
          tuple of key, and a list of corresponding items in values
  
          Notes
          -----
          This approach is lazy, insofar as grouped values are close in their iterable