¿Hay un reset_index para columnas o una forma de mover los encabezados de columna a un índice interno dejando sus posiciones de índice como el índice externo?

Ejemplo de dataframe:

df = pd.DataFrame(np.random.randint(0, 10, size=(10, 4)), columns=list('ABCD')) 

¿Hay una manera de restablecer el índice para las columnas? ¿O para insertar fácilmente una fila con valores de posición de índice de columna? Preferiría que las posiciones de índice sean el índice más externo y me queden con los encabezados de columna como el índice más interno.

Creo que puedes usar numpy.arange o range :

 np.random.seed(10) df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD')) df.columns = np.arange(len(df.columns)) #alternatively #df.columns = range(len(df.columns)) print (df) 0 1 2 3 0 9 4 0 1 1 9 0 1 8 2 9 0 8 6 3 4 3 0 4 4 6 8 1 8 5 4 1 3 6 6 5 3 9 6 7 9 1 9 4 8 2 6 7 8 9 8 9 2 0 

Pero perdió valores de columna.

Si necesita MultiIndex sin nombres:

 df.columns = [np.arange(len(df.columns)), df.columns] print (df) 0 1 2 3 ABCD 0 9 4 0 1 1 9 0 1 8 2 9 0 8 6 3 4 3 0 4 4 6 8 1 8 5 4 1 3 6 6 5 3 9 6 7 9 1 9 4 8 2 6 7 8 9 8 9 2 0 

y para nombres use MultiIndex.from_arrays :

 names = ['a','b'] df.columns = pd.MultiIndex.from_arrays([np.arange(len(df.columns)), df.columns], names=names) print (df) a 0 1 2 3 b ABCD 0 9 4 0 1 1 9 0 1 8 2 9 0 8 6 3 4 3 0 4 4 6 8 1 8 5 4 1 3 6 6 5 3 9 6 7 9 1 9 4 8 2 6 7 8 9 8 9 2 0 

Eliminar nombres de columna

 df.columns = pd.RangeIndex(df.columns.size) df 

Salida:

  0 1 2 3 #---------------# 0 0 1 3 3 1 2 2 0 2 2 2 1 3 1 3 2 1 0 0 

Eliminar columna nombra una línea
Podría tener problemas de rendimiento y efectos secundarios, consulte la discusión a continuación.

 df.T.reset_index(drop=True).T 

Salida:

  0 1 2 3 #---------------# 0 0 1 3 3 1 2 2 0 2 2 2 1 3 1 3 2 1 0 0 

Nombres de columnas en vivo como una fila en una línea
Los mismos problemas, ver discusión a continuación.

 df.T.reset_index().T 

Salida:

  0 1 2 3 #-------------------# index ABCD 0 0 1 3 3 1 2 2 0 2 2 2 1 3 1 3 2 1 0 0 

Nombres de columnas en vivo como fila
Manera efectiva.

  #heterogeneous DataFrame creation df = pd.DataFrame(np.random.randint(0,4,size=(4, 3)), columns=list('789')).join( pd.DataFrame(list('bcde'),columns=['A'])) df.index.name = '4' #save column as row then reindex column names df = df.append(pd.Series( df.columns,name = df.index.name,index= df.columns ), ) df.columns = pd.RangeIndex(df.columns.size) print (df) print(df.info()) 

Salida: NB necesitará un esfuerzo adicional para evitar la actualización de todos los datos

  0 1 2 3 #-----------# 4 0 2 3 2 b 1 1 0 2 c 2 3 1 3 d 3 3 3 2 e 4 7 8 9 A  Index: 5 entries, 0 to 4 Data columns (total 4 columns): 0 5 non-null object 1 5 non-null object 2 5 non-null object 3 5 non-null object dtypes: object(4) 

Añadir columna secundaria índice una línea
Podría tener problemas de rendimiento y efectos secundarios, consulte la discusión a continuación.

 df.T.set_index(pd.RangeIndex(df.columns.size),append=True).T 

Salida:

  ABCD 0 1 2 3 #---------------# 0 0 1 3 3 1 2 2 0 2 2 2 1 3 1 3 2 1 0 0 

Crítica de una línea de enfoque.

Problemas de rendimiento :
Para grandes conjuntos de datos podrían ser costos inaceptables de doble T , pero en casos simples una línea que devuelve una copia de DataFrame puede ser útil. Ver los resultados de la prueba

 In [294]: for i in range (3,7): ...: df = pd.DataFrame(np.random.randint(0,9,size=(10**i, 10**3))) ...: print ('shape:',df.shape) ...: %timeit df.T.reset_index(drop=True) ...: shape: (1000, 1000) 100 loops, best of 3: 3.2 ms per loop shape: (10000, 1000) 10 loops, best of 3: 29.3 ms per loop shape: (100000, 1000) 1 loop, best of 3: 546 ms per loop shape: (1000000, 1000) 1 loop, best of 3: 9.9 s per loop In [295]: %timeit df.columns = pd.RangeIndex(df.columns.size) The slowest run took 28.60 times longer than the fastest. This could mean that an intermediate result is being cached. 100000 loops, best of 3: 7.74 µs per loop 

Efecto colateral (upcasting) :
Los DataFrames heterogéneos serán actualizados

 In [352]: df = pd.DataFrame(np.random.randint(0,4,size=(4, 3)), columns=list('789')).join( ...: pd.DataFrame(list('bcde'),columns=['A'])) In [353]: df.info()  RangeIndex: 4 entries, 0 to 3 Data columns (total 4 columns): 7 4 non-null int64 8 4 non-null int64 9 4 non-null int64 A 4 non-null object dtypes: int64(3), object(1) memory usage: 208.0+ bytes 

.TT upcasting

 In [354]: df.TTinfo()  RangeIndex: 4 entries, 0 to 3 Data columns (total 4 columns): 7 4 non-null object 8 4 non-null object 9 4 non-null object A 4 non-null object dtypes: object(4) memory usage: 208.0+ bytes