Pandas: nombres de columnas multinivel

pandas tiene soporte para nombres de columnas de varios niveles:

 >>> x = pd.DataFrame({'instance':['first','first','first'],'foo':['a','b','c'],'bar':rand(3)}) >>> x = x.set_index(['instance','foo']).transpose() >>> x.columns MultiIndex [(u'first', u'a'), (u'first', u'b'), (u'first', u'c')] >>> x instance first foo abc bar 0.102885 0.937838 0.907467 

Esta característica es muy útil ya que permite que varias versiones del mismo dataframe se agreguen ‘horizontalmente’ con el primer nivel de los nombres de columna (en mi ejemplo de instance ) que distinguen las instancias.

Imagina que ya tengo un dataframe como este:

  abc bar 0.102885 0.937838 0.907467 

¿Hay una buena manera de agregar otro nivel a los nombres de columna, similar a esto para el índice de fila:

 x['instance'] = 'first' x.set_level('instance',append=True) 

Prueba esto:

 df=pd.DataFrame({'a':[1,2,3],'b':[4,5,6]}) columns=[('c','a'),('c','b')] df.columns=pd.MultiIndex.from_tuples(columns) 

Puedes usar concat . Déle un diccionario de marcos de datos donde la clave sea el nuevo nivel de columna que desea agregar.

 In [46]: d = {} In [47]: d['first_level'] = pd.DataFrame(columns=['idx', 'a', 'b', 'c'], data=[[10, 0.89, 0.98, 0.31], [20, 0.34, 0.78, 0.34]]).set_index('idx') In [48]: pd.concat(d, axis=1) Out[48]: first_level abc idx 10 0.89 0.98 0.31 20 0.34 0.78 0.34 

Puedes usar la misma técnica para crear múltiples niveles.

 In [49]: d['second_level'] = pd.DataFrame(columns=['idx', 'a', 'b', 'c'], data=[[10, 0.29, 0.63, 0.99], [20, 0.23, 0.26, 0.98]]).set_index('idx') In [50]: pd.concat(d, axis=1) Out[50]: first_level second_level abcabc idx 10 0.89 0.98 0.31 0.29 0.63 0.99 20 0.34 0.78 0.34 0.23 0.26 0.98