Redefiniendo el índice en un objeto Pandas DataFrame

84

Estoy intentando volver a indexar un DataFrameobjeto pandas , así,

From:
            a   b   c
        0   1   2   3
        1  10  11  12
        2  20  21  22

To :
           b   c
       1   2   3
      10  11  12
      20  21  22

Estoy haciendo 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
    a   b   c
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
     b   c
1   11  12
10 NaN NaN
20 NaN NaN

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

nitin
fuente
1
debido a que está utilizando el primer DF para construir el segundo, esto solo obtendrá las filas donde idx2 se cruza con el data.index, es decir. fila 1
RuiDC

Respuestas:

188

¿Por qué no usas simplemente el set_indexmétodo?

In : col = ['a','b','c']

In : data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col)

In : data
Out:
    a   b   c
0   1   2   3
1  10  11  12
2  20  21  22

In : data2 = data.set_index('a')

In : data2
Out:
     b   c
a
1    2   3
10  11  12
20  21  22
Avaris
fuente
17
Para eliminar el nombre del índice, como en el ejemplo original: data2.index.name = None
Daniele
5

Si no quiere 'a' en el índice

En:

col = ['a','b','c']

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

data

Afuera:

    a   b   c
0   1   2   3
1  10  11  12
2  20  21  22

En:

data2 = data.set_index('a')

Afuera:

     b   c
a
1    2   3
10  11  12
20  21  22

En:

data2.index.name = None

Afuera:

     b   c
 1   2   3
10  11  12
20  21  22
Aakash Saxena
fuente
1
La segunda salida no es correcta. Todavía hay una columna sin nombre a la izquierda que contiene 0, 1, 2.
Yster