Actualizar índice después de ordenar el marco de datos

101

Toma el siguiente marco de datos:

x = np.tile(np.arange(3),3)
y = np.repeat(np.arange(3),3)
df = pd.DataFrame({"x": x, "y": y})
   x  y
0  0  0
1  1  0
2  2  0
3  0  1
4  1  1
5  2  1
6  0  2
7  1  2
8  2  2

Necesito ordenarlo xprimero, y solo segundo por y:

df2 = df.sort(["x", "y"])
   x  y
0  0  0
3  0  1
6  0  2
1  1  0
4  1  1
7  1  2
2  2  0
5  2  1
8  2  2

¿Cómo puedo cambiar el índice para que vuelva a subir? Es decir, ¿cómo obtengo esto?

   x  y
0  0  0
1  0  1
2  0  2
3  1  0
4  1  1
5  1  2
6  2  0
7  2  1
8  2  2

He probado lo siguiente. Desafortunadamente, no cambia el índice en absoluto:

df2.reindex(np.arange(len(df2.index)))
Leming
fuente
1
Si no necesita un nuevo df, intentedf.sort(["x", "y"], ignore_index=True, inplace=True)
InnocentBystander

Respuestas:

174

Puede restablecer el índice usando reset_indexpara recuperar un índice predeterminado de 0, 1, 2, ..., n-1 (y usar drop=Truepara indicar que desea eliminar el índice existente en lugar de agregarlo como una columna adicional a su marco de datos) :

In [19]: df2 = df2.reset_index(drop=True)

In [20]: df2
Out[20]:
   x  y
0  0  0
1  0  1
2  0  2
3  1  0
4  1  1
5  1  2
6  2  0
7  2  1
8  2  2
joris
fuente
Eso fue muy útil. exp_data = exp_data.reindex (['año'], eje = 'columnas') mantuvo el índice anterior. Drop elimina el índice antiguo.
Golden Lion
10

Dado que pandas 1.0.0 df.sort_valuestiene un nuevo parámetro ignore_indexque hace exactamente lo que necesita:

In [1]: df2 = df.sort_values(by=['x','y'],ignore_index=True)

In [2]: df2
Out[2]:
   x  y
0  0  0
1  0  1
2  0  2
3  1  0
4  1  1
5  1  2
6  2  0
7  2  1
8  2  2
David
fuente
Creo que esto es nuevo en la versión 1.0.0.
zyy
5

Puede establecer nuevos índices usando set_index:

df2.set_index(np.arange(len(df2.index)))

Salida:

   x  y
0  0  0
1  0  1
2  0  2
3  1  0
4  1  1
5  1  2
6  2  0
7  2  1
8  2  2
ilyakhov
fuente
8
Esto es innecesario, reset_index()
úselo