Issue 1:
Code Sample

Create an Enum as described in the Python docs, then create a dataframe and try to set multiindex:

from enum import Enum
import pandas as pd

class Method(Enum):
LINEAR = 1
CONSTANT= 2

df = pd.DataFrame(data={"a":[Method.LINEAR, Method.CONSTANT,
Method.LINEAR, Method.CONSTANT],
"b":[1,2,2,3],
"c":[0,1,2,3]})

df.set_index(["a", "b"])

Error:

File "C:\A_PROGRAMS\anaconda3\lib\site-packages\pandas\core\arrays\categorical.py", line 2515, in _factorize_from_iterable

cat = Categorical(values, ordered=True)

File "C:\A_PROGRAMS\anaconda3\lib\site-packages\pandas\core\arrays\categorical.py", line 351, in init

raise TypeError("'values' is not ordered, please "

Problem description

Enum is a data type of the official Python 3 STL and should be supported by pandas. set_index works fine with enums when using them alone, e.g. df.set_index(["a"]) works.

I assume that the "ordered=True" might be the problem in categorical.py?

Output of pd.show_versions()

INSTALLED VERSIONS

commit: None

python: 3.6.5.final.0

python-bits: 64

OS: Windows

OS-release: 7

machine: AMD64

processor: Intel64 Family 6 Model 94 Stepping 3, GenuineIntel

byteorder: little

LC_ALL: None

LANG: en

LOCALE: None.None

pandas: 0.23.0

pytest: 3.5.1

pip: 10.0.1

setuptools: 39.1.0

Cython: 0.28.2

numpy: 1.14.3

scipy: 1.1.0

pyarrow: 0.9.0

xarray: None

IPython: 6.4.0

sphinx: 1.7.4

patsy: 0.5.0

dateutil: 2.7.3

pytz: 2018.4

blosc: None

bottleneck: 1.2.1

tables: 3.4.3

numexpr: 2.6.5

feather: 0.4.0

matplotlib: 2.2.2

openpyxl: 2.5.3

xlrd: 1.1.0

xlwt: 1.3.0

xlsxwriter: 1.0.4

lxml: 4.2.1

bs4: 4.6.0

html5lib: 1.0.1

sqlalchemy: 1.2.7

pymysql: None

psycopg2: None

jinja2: 2.10

s3fs: None

fastparquet: None

pandas_gbq: None

pandas_datareader: None

Issue 2:
Code Sample, a copy-pastable example if possible

import pandas as pd
from enum import Enum

MyEnum = Enum("MyEnum", "A B")

df = pd.DataFrame(columns=pd.MultiIndex.from_product(iterables=[MyEnum, [1, 2]])) # TypeError: 'values' is not ordered, please explicitly specify the categories order by passing in a categories argument.

df = pd.DataFrame(columns=pd.MultiIndex.from_product(iterables=[pd.Series(MyEnum, dtype="category"), [1, 2]])) # this workaround successfully executes, but...
df.append({(MyEnum.A, 1): "abc", (MyEnum.B, 2): "xyz"}, ignore_index=True) # ... this "append" statement then raises the same error.

df.loc[0, [(MyEnum.A, 1), (MyEnum.B, 2)]] = 'abc', 'xyz' # this works, but is less desirable (can't pass a dict, need to come up with a row indexer, etc.)

Problem description

Though Enums can easily be used as column indexers, strange errors appear to arise when they are used (as one of the factors) in a MultiIndex.

The multiindex (and dataframe) can be created successfully if an (ordered) categorical Series is passed to the constructor. Yet in this case, appending rows in the usual way fails. One can create new rows using .loc, and yet this is not as nice.

This whole situation can be avoided by using strings instead of an Enum. Alternatively, one can use an IntEnum---and yet this essentially uses the underlying integers, instead of the names, as the column indexers.

As the use of enums as columns is perfectly supported in the case of a simple index, it seems a shortcoming that they can't be used in a MultiIndex.

Expected Output

>>> df = pd.DataFrame(columns=pd.MultiIndex.from_product(iterables=[MyEnum, [1, 2]]))
>>> df
Empty DataFrame
Columns: [(MyEnum.A, 1), (MyEnum.A, 2), (MyEnum.B, 1), (MyEnum.B, 2)]
Index: []
>>> df.append({(MyEnum.A, 1): "abc", (MyEnum.B, 2): "xyz"}, ignore_index=True)
MyEnum.A MyEnum.B
1 2 1 2
0 abc NaN NaN xyz

Output of pd.show_versions()

INSTALLED VERSIONS

commit: None

python: 3.6.3.final.0

python-bits: 64

OS: Darwin

OS-release: 17.5.0

machine: x86_64

processor: i386

byteorder: little

LC_ALL: None

LANG: en_US.UTF-8

LOCALE: en_US.UTF-8

pandas: 0.23.0

pytest: None

pip: 10.0.1

setuptools: 39.0.1

Cython: None

numpy: 1.13.3

scipy: None

pyarrow: None

xarray: None

IPython: None

sphinx: None

patsy: None

dateutil: 2.6.1

pytz: 2017.3

blosc: None

bottleneck: None

tables: None

numexpr: None

feather: None

matplotlib: None

openpyxl: None

xlrd: None

xlwt: None

xlsxwriter: None

lxml: None

bs4: None

html5lib: None

sqlalchemy: None

pymysql: None

psycopg2: None

jinja2: None

s3fs: None

fastparquet: None

pandas_gbq: None

pandas_datareader: None