Redefiniendo el índice en un objeto Pandas DataFrame

Estoy tratando de volver a indexar un objeto DataFrame pandas, como así,

 From: abc 0 1 2 3 1 10 11 12 2 20 21 22 To : bc 1 2 3 10 11 12 20 21 22 

Voy a hacer esto como se muestra a continuación y obtengo la respuesta incorrecta. ¿Alguna pista sobre cómo hacer esto?

 >>> col = ['a','b','c'] >>> data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col) >>> data abc 0 1 2 3 1 10 11 12 2 20 21 22 >>> idx2 = data.a.values >>> idx2 array([ 1, 10, 20], dtype=int64) >>> data2 = DataFrame(data,index=idx2,columns=col[1:]) >>> data2 bc 1 11 12 10 NaN NaN 20 NaN NaN 

¿Alguna idea de por qué esto está pasando?

¿Por qué no usas simplemente el método set_index ?

 In : col = ['a','b','c'] In : data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col) In : data Out: abc 0 1 2 3 1 10 11 12 2 20 21 22 In : data2 = data.set_index('a') In : data2 Out: bc a 1 2 3 10 11 12 20 21 22 

Si no quieres ‘a’ en el índice

En:

 col = ['a','b','c'] data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col) data 

Afuera:

  abc 0 1 2 3 1 10 11 12 2 20 21 22 

En:

 data2 = data.set_index('a') 

Afuera:

  bc a 1 2 3 10 11 12 20 21 22 

En:

 data2.index.name = None 

Afuera:

  bc 1 2 3 10 11 12 20 21 22 

Si desea establecer el índice sin perder la columna, use set_index con drop=False :

 data.set_index('a', drop=False) abc a 1 1 2 3 10 10 11 12 20 20 21 22 

Otra opción es simplemente establecer el atributo de index directamente, esto es útil para aplicaciones críticas de rendimiento:

 data.index = data['a'] data abc a 1 1 2 3 10 10 11 12 20 20 21 22 

O bien, si “a” debería aparecer, use

 data.index = data.pop('a') data bc a 1 2 3 10 11 12 20 21 22 

Tanto el pop como la asignación a index son operaciones en el lugar, a diferencia de set_index que devuelve una copia de los datos. Aquí hay algunos tiempos:

 df_ = data.copy() df = pd.concat([df_] * 10000, ignore_index=True) %timeit df.set_index('a', drop=False) %timeit df.index = df['a'] 784 µs ± 68 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 132 µs ± 2.12 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) 

Nota
No se deje engañar por el parámetro inplace=True . Esto solo crea una copia de los datos y la asigna de nuevo a la variable original. Tanto inplace=True como inplace=False siempre generan una copia.


Para referencia, para establecer el índice en enteros crecientes monótonamente , puede establecer el índice de manera eficiente en cualquier objeto de rango.

 df.index = pd.RangeIndex(len(df)) df.index = range(len(df)) df.index = np.arange(len(df)) 

df.index se puede asignar a cualquier secuencia similar a una lista, siempre que la secuencia tenga la misma longitud que df .