采取以下数据框架:
x = np.tile(np.arange(3),3)
y = np.repeat(np.arange(3),3)
df = pd.DataFrame({"x": x, "y": y})
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我需要先排序x,然后排在第二位y:
df2 = df.sort(["x", "y"])Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如何更改索引以使其再次升序.即我如何得到这个:
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
Run Code Online (Sandbox Code Playgroud)
我尝试了以下内容.不幸的是,它根本没有改变索引:
df2.reindex(np.arange(len(df2.index)))
Run Code Online (Sandbox Code Playgroud)
jor*_*ris 120
您可以使用重置索引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
Run Code Online (Sandbox Code Playgroud)
小智 36
由于 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
Run Code Online (Sandbox Code Playgroud)
df.sort()已弃用,请使用df.sort_values(...):https : //pandas.pydata.org/pandas-docs/stable/generation/pandas.DataFrame.sort_values.html
然后按照乔里斯的回答做 df.reset_index(drop=True)
以下作品!
如果你想改变现有的dataframe本身,你可以直接使用
df.sort_values(by=['col1'], inplace=True)
df.reset_index(drop=True, inplace=True)
df
>> col1 col2 col3 col4
0 A 2 0 a
1 A 1 1 B
2 B 9 9 c
5 C 4 3 F
4 D 7 2 e
3 NaN 8 4 D
Run Code Online (Sandbox Code Playgroud)
否则,如果您不想更改现有数据框,但想将排序后的数据框单独存储到另一个变量中,您可以使用:
df_sorted = df.sort_values(by=['col1']).reset_index(drop=True)
df_sorted
>> col1 col2 col3 col4
0 A 2 0 a
1 A 1 1 B
2 B 9 9 c
3 C 4 3 F
4 D 7 2 e
5 NaN 8 4 D
df
>> col1 col2 col3 col4
0 A 2 0 a
1 A 1 1 B
2 B 9 9 c
3 NaN 8 4 D
4 D 7 2 e
5 C 4 3 F
Run Code Online (Sandbox Code Playgroud)
您可以使用set_index以下方法设置新索引:
df2.set_index(np.arange(len(df2.index)))
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)