Оновити індекс після сортування фрейму даних


100

Візьміть наступний фрейм даних:

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

Мені потрібно відсортувати це за xпершим, і лише за другим за 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

Як я можу змінити індекс таким чином, щоб він знову зростав. Тобто як я можу це отримати:

   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

Я спробував наступне. На жаль, це зовсім не змінює індекс:

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

1
Якщо вам не потрібен новий df, спробуйтеdf.sort(["x", "y"], ignore_index=True, inplace=True)
InnocentBystander

Відповіді:


173

Ви можете скинути індекс за допомогою, reset_indexщоб повернути індекс за замовчуванням 0, 1, 2, ..., n-1 (і використовувати, drop=Trueщоб вказати, що ви хочете скинути існуючий індекс, а не додавати його як додатковий стовпець до вашого кадру даних) :

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

Це було дуже корисно. exp_data = exp_data.reindex (['рік'], вісь = 'стовпці') зберігав старий індекс. Drop видаляє старий індекс.
Золотий Лев


9

Оскільки pandas 1.0.0 df.sort_valuesмає новий параметр, ignore_indexякий робить саме те, що вам потрібно:

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

Я думаю, що це нове у версії 1.0.0.
zyy

5

Ви можете встановити нові індекси, використовуючи set_index:

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

Вихід:

   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
Це непотрібно, використовуйте reset_index()замість цього
smci
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.