问题:排序数据框后更新索引
采取以下数据框架:
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)))
回答 0
您可以使用来重置索引,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
回答 1
df.sort()
已弃用,请使用df.sort_values(...)
:https : //pandas.pydata.org/pandas-docs/stable/generation/pandas.DataFrame.sort_values.html
然后按照乔里斯的回答做 df.reset_index(drop=True)
回答 2
由于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
回答 3
您可以使用来设置新索引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