Pandas:如何按列和按索引对数据框进行排序

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)

如何首先对列进行排序并将索引排在第二位?

jpp*_*jpp 7

您可以按索引排序,然后按列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)

  • 我同意,我认为这个解决方案更容易阅读.+1谢谢! (2认同)

stu*_*ent 6

使用lexsortnumpy可能是另一种方式,也可以更快:

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)