## 问题：排序数据框后更新索引

``````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
``````

``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)))
``````

Take the following 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
``````

I need to sort it by `x` first, and only second by `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
``````

How can I change the index such that it is ascending again. I.e. how do I get this:

``````   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
``````

I have tried the following. Unfortunately, it doesn’t change the index at all:

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

## 回答 0

``````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
``````

You can reset the index using to get back a default index of 0, 1, 2, …, n-1 (and use `drop=True` to indicate you want to drop the existing index instead of adding it as an additional column to your 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
``````

## 回答 1

`df.sort()`已弃用，请使用`df.sort_values(...)`https : //pandas.pydata.org/pandas-docs/stable/generation/pandas.DataFrame.sort_values.html

`df.sort()` is deprecated, use `df.sort_values(...)`: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_values.html

Then follow joris’ answer by doing `df.reset_index(drop=True)`

## 回答 2

``````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
``````

Since pandas 1.0.0 has a new parameter `ignore_index` which does exactly what you need:

``````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
``````

## 回答 3

``````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
``````

You can set new indices by using `set_index`:

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

Output:

``````   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
``````