Обновить индекс после сортировки фрейма данных

102

Возьмите следующий фрейм данных:

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

Ответы:

175

Вы можете сбросить индекс, используя, 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 (['year'], axis = 'columns') сохранил старый индекс. Drop удаляет старый индекс.
Golden Lion
10

Поскольку в 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.
зыы
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