排序数据框后更新索引


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

Answers:


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(['year'],axis ='columns')保留了旧索引。Drop删除旧索引。
金狮奖


9

由于pandas 1.0.0df.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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.