colapsar un pandas multiindex

Supongamos que tengo un DataFrame con columnas MultiIndex . ¿Cómo puedo colapsar los niveles a una concatenación de los valores para que solo tenga un nivel?

Preparar

 np.random.seed([3, 14]) col = pd.MultiIndex.from_product([list('ABC'), list('DE'), list('FG')]) df = pd.DataFrame(np.random.rand(4, 12) * 10, columns=col).astype(int) print df ABCDEDEDEFGFGFGFGFGFG 0 2 1 1 7 5 9 9 2 7 4 0 3 1 3 7 1 1 5 3 1 4 3 5 6 0 2 2 6 9 9 9 5 7 0 1 2 7 5 3 2 2 8 0 3 9 4 7 0 8 2 5 

Quiero que el resultado se vea así:

  ADF ADG AEF AEG BDF BDG BEF BEG CDF CDG CEF CEG 0 2 1 1 7 5 9 9 2 7 4 0 3 1 3 7 1 1 5 3 1 4 3 5 6 0 2 2 6 9 9 9 5 7 0 1 2 7 5 3 2 2 8 0 3 9 4 7 0 8 2 5 

puedes probar esto

 In [200]: cols = pd.Series(df.columns.tolist()).apply(pd.Series).sum(axis=1) In [201]: cols Out[201]: 0 ADF 1 ADG 2 AEF 3 AEG 4 BDF 5 BDG 6 BEF 7 BEG 8 CDF 9 CDG 10 CEF 11 CEG dtype: object 

Solución

hice esto

 def collapse_columns(df): df = df.copy() if isinstance(df.columns, pd.MultiIndex): df.columns = df.columns.to_series().apply(lambda x: "".join(x)) return df 

Tuve que comprobar si es un MultiIndex porque, de no ser así, dividiría una cadena y la combinaría con el separador que elegí en la join .