Aggiorna l'indice dopo aver ordinato il data-frame


101

Prendi il seguente data-frame:

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

Devo ordinarlo per xprimo e solo secondo per 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

Come posso modificare l'indice in modo tale che sia di nuovo crescente. Cioè come ottengo questo:

   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

Ho provato quanto segue. Sfortunatamente, non cambia affatto l'indice:

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

1
Se non hai bisogno di un nuovo df, provadf.sort(["x", "y"], ignore_index=True, inplace=True)
InnocentBystander

Risposte:


174

È possibile reimpostare l'indice utilizzando reset_indexper recuperare un indice predefinito di 0, 1, 2, ..., n-1 (e utilizzare drop=Trueper indicare che si desidera eliminare l'indice esistente invece di aggiungerlo come colonna aggiuntiva al dataframe) :

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

È stato di grande aiuto. exp_data = exp_data.reindex (['year'], axis = 'columns') ha mantenuto il vecchio indice. Drop rimuove il vecchio indice.
Leone d'oro,


10

Poiché pandas 1.0.0 df.sort_valuesha un nuovo parametro ignore_indexche fa esattamente ciò di cui hai bisogno:

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

Penso che questa sia una novità nella versione 1.0.0.
zyy

5

Puoi impostare nuovi indici utilizzando set_index:

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

Produzione:

   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

8
Questo non è necessario, usa reset_index()invece
smci
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.