Aktualisieren Sie den Index nach dem Sortieren des Datenrahmens

92

Nehmen Sie den folgenden Datenrahmen:

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

Ich muss es xzuerst sortieren und erst dann nach 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

Wie kann ich den Index so ändern, dass er wieder aufsteigt? Dh wie bekomme ich das:

   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

Ich habe folgendes versucht. Leider ändert sich der Index überhaupt nicht:

df2.reindex(np.arange(len(df2.index)))
Lemming
quelle
Wenn Sie keinen neuen df benötigen, versuchen Sie esdf.sort(["x", "y"], ignore_index=True, inplace=True)
InnocentBystander

Antworten:

161

Sie können den Index zurücksetzen , indem reset_indexSie einen Standardindex von 0, 1, 2, ..., n-1 drop=Truewiederherstellen (und damit angeben, dass Sie den vorhandenen Index löschen möchten, anstatt ihn als zusätzliche Spalte zu Ihrem Datenrahmen hinzuzufügen). ::

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
quelle
Das war super hilfreich. exp_data = exp_data.reindex (['Jahr'], Achse = 'Spalten') hat den alten Index beibehalten. Drop entfernt den alten Index.
Goldener Löwe
7

Da pandas 1.0.0 df.sort_valueseinen neuen Parameter ignore_indexhat, der genau das tut, was Sie brauchen:

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
quelle
Ich denke das ist neu in Version 1.0.0.
Zyy
5

Sie können neue Indizes festlegen, indem Sie Folgendes verwenden set_index:

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

Ausgabe:

   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
quelle
7
Dies ist unnötig, verwenden Sie reset_index()stattdessen
smci