Dav*_*d M 4 python sorting dataframe pandas
鉴于DataFrame:
import pandas as pd
df = pd.DataFrame([6, 4, 2, 4, 5], index=[2, 6, 3, 4, 5], columns=['A'])
Run Code Online (Sandbox Code Playgroud)
结果是:
A
2 6
6 4
3 2
4 4
5 5
Run Code Online (Sandbox Code Playgroud)
现在,我想按列A和索引的值排序.
例如
df.sort_values(by='A')
Run Code Online (Sandbox Code Playgroud)
返回
A
3 2
6 4
4 4
5 5
2 6
Run Code Online (Sandbox Code Playgroud)
而我想
A
3 2
4 4
6 4
5 5
2 6
Run Code Online (Sandbox Code Playgroud)
如何首先对列进行排序并将索引排在第二位?
您可以按索引排序,然后按列A排序kind='mergesort'
.
这是有效的,因为mergesort是稳定的.
res = df.sort_index().sort_values('A', kind='mergesort')
Run Code Online (Sandbox Code Playgroud)
结果:
A
3 2
4 4
6 4
5 5
2 6
Run Code Online (Sandbox Code Playgroud)
使用lexsort
numpy可能是另一种方式,也可以更快:
df.iloc[np.lexsort((df.index, df.A.values))] # Sort by A.values, then by index
Run Code Online (Sandbox Code Playgroud)
结果:
A
3 2
4 4
6 4
5 5
2 6
Run Code Online (Sandbox Code Playgroud)
比较timeit
:
%%timeit
df.iloc[np.lexsort((df.index, df.A.values))] # Sort by A.values, then by index
Run Code Online (Sandbox Code Playgroud)
结果:
1000 loops, best of 3: 278 µs per loop
Run Code Online (Sandbox Code Playgroud)
再次使用重置索引和设置索引:
%%timeit
df.reset_index().sort_values(by=['A','index']).set_index('index')
Run Code Online (Sandbox Code Playgroud)
结果:
100 loops, best of 3: 2.09 ms per loop
Run Code Online (Sandbox Code Playgroud)