I don't think so: in my head a categorical works something like this:

```
class Categorical
    levels = None
    ordered = False
    labels = None
    value_pointer = []

    def __init__(values, levels=None, labels=None, ordered=False):
         if not levels:
               levels = list(set(values)) # all unique values
         if not labels:
               labels = levels
         self.ordered = ordered
         self.value_pointer = [levels.index(val) if val in levels else np.nan for val in values]
         self.levels = levels
         self.labels = labels
   
   # should be turned into a property
   def values():
         return [labels[pointer] if not is_nan(pointer) else np.nan for pointer in value_pointer]

    def min():
          if not self.ordered:
               raise TypeError("Categorical not ordered")
         return labels[min(self.value_pointer)]

    def sort_inplace():
         if not self.ordered:
              raise TypeError("Categorical not ordered")
         self.value_pointer = sorted(self.value_pointer)

    def astype(result_type):
        return Series(self.values()).astype(result_type)
```