Perbarui indeks setelah menyortir bingkai data

103

Ambil bingkai data berikut:

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

Saya perlu mengurutkan berdasarkan xpertama, dan kedua dengan 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

Bagaimana saya bisa mengubah indeks sehingga naik lagi. Yaitu bagaimana cara mendapatkan ini:

   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

Saya telah mencoba yang berikut ini. Sayangnya, itu tidak mengubah indeks sama sekali:

df2.reindex(np.arange(len(df2.index)))
Lemming
sumber
3
Jika Anda tidak membutuhkan df baru, cobadf.sort(["x", "y"], ignore_index=True, inplace=True)
InnocentBystander

Jawaban:

179

Anda dapat mengatur ulang indeks menggunakan reset_indexuntuk mendapatkan kembali indeks default 0, 1, 2, ..., n-1 (dan digunakan drop=Trueuntuk menunjukkan Anda ingin menghapus indeks yang ada alih-alih menambahkannya sebagai kolom tambahan ke kerangka data Anda) :

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
sumber
Itu sangat membantu. exp_data = exp_data.reindex (['year'], axis = 'column') menyimpan indeks lama. Penurunan menghapus indeks lama.
Singa Emas
14

Karena pandas 1.0.0 df.sort_valuesmemiliki parameter baru ignore_indexyang melakukan apa yang Anda butuhkan:

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
sumber
Saya rasa ini baru di versi 1.0.0.
zyy
5

Anda dapat mengatur indeks baru dengan menggunakan set_index:

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

Keluaran:

   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.dll
sumber
8
Ini tidak perlu, gunakan reset_index()saja
smci