Establecer encabezados de columna DataFrame en un MultiIndex

¿Cómo convierto un dataframe existente con columnas de un solo nivel para tener columnas de índice jerárquico (MultiIndex)?

Ejemplo de dataframe:

In [1]: import pandas as pd from pandas import Series, DataFrame df = DataFrame(np.arange(6).reshape((2,3)), index=['A','B'], columns=['one','two','three']) df Out [1]: one two three A 0 1 2 B 3 4 5 

Habría pensado que reindex () funcionaría, pero me sale NaN:

 In [2]: df.reindex(columns=[['odd','even','odd'],df.columns]) Out [2]: odd even odd one two three A NaN NaN NaN B NaN NaN NaN 

Lo mismo si uso DataFrame ():

 In [3]: DataFrame(df,columns=[['odd','even','odd'],df.columns]) Out [3]: odd even odd one two three A NaN NaN NaN B NaN NaN NaN 

Este último enfoque realmente funciona si especifico df.values:

 In [4]: DataFrame(df.values,index=df.index,columns=[['odd','even','odd'],df.columns]) Out [4]: odd even odd one two three A 0 1 2 B 3 4 5 

¿Cuál es la forma correcta de hacer esto? ¿Por qué reindex () da NaN’s?

Estabas cerca, solo establece las columnas directamente en un nuevo índice (del mismo tamaño) similar a un índice (que si es una lista de listas se convertirá en un índice múltiple)

 In [8]: df Out[8]: one two three A 0 1 2 B 3 4 5 In [10]: df.columns = [['odd','even','odd'],df.columns] In [11]: df Out[11]: odd even odd one two three A 0 1 2 B 3 4 5 

Reindex reordenará / filtrará el índice existente. La razón por la que obtiene todos los nans es porque está diciendo que, oigan las columnas existentes que coinciden con este nuevo índice; ninguna coincidencia, así que eso es lo que obtienes