@classmethod<EOL><INDENT>def from_frame(cls, df, sortorder=None, names=None):<DEDENT>
if not isinstance(df, ABCDataFrame):<EOL><INDENT>raise TypeError("<STR_LIT>")<EOL><DEDENT>column_names, columns = lzip(*df.iteritems())<EOL>names = column_names if names is None else names<EOL>return cls.from_arrays(columns, sortorder=sortorder, names=names)<EOL>
Make a MultiIndex from a DataFrame.

.. versionadded:: 0.24.0

Parameters
----------
df : DataFrame
    DataFrame to be converted to MultiIndex.
sortorder : int, optional
    Level of sortedness (must be lexicographically sorted by that
    level).
names : list-like, optional
    If no names are provided, use the column names, or tuple of column
    names if the columns is a MultiIndex. If a sequence, overwrite
    names with the given sequence.

Returns
-------
MultiIndex
    The MultiIndex representation of the given DataFrame.

See Also
--------
MultiIndex.from_arrays : Convert list of arrays to MultiIndex.
MultiIndex.from_tuples : Convert list of tuples to MultiIndex.
MultiIndex.from_product : Make a MultiIndex from cartesian product
                          of iterables.

Examples
--------
>>> df = pd.DataFrame([['HI', 'Temp'], ['HI', 'Precip'],
...                    ['NJ', 'Temp'], ['NJ', 'Precip']],
...                   columns=['a', 'b'])
>>> df
      a       b
0    HI    Temp
1    HI  Precip
2    NJ    Temp
3    NJ  Precip

>>> pd.MultiIndex.from_frame(df)
MultiIndex(levels=[['HI', 'NJ'], ['Precip', 'Temp']],
           codes=[[0, 0, 1, 1], [1, 0, 1, 0]],
           names=['a', 'b'])

Using explicit names, instead of the column names

>>> pd.MultiIndex.from_frame(df, names=['state', 'observation'])
MultiIndex(levels=[['HI', 'NJ'], ['Precip', 'Temp']],
           codes=[[0, 0, 1, 1], [1, 0, 1, 0]],
           names=['state', 'observation'])