鉴于DataFrame:
import pandas as pd
df = pd.DataFrame([6, 4, 2, 4, 5], index=[2, 6, 3, 4, 5], columns=['A'])
结果:
A
2 6
6 4
3 2
4 4
5 5
现在,我想按列A和索引的值进行排序。
e.g。
df.sort_values(by='A')
返回
A
3 2
6 4
4 4
5 5
2 6
我希望
A
3 2
4 4
6 4
5 5
2 6
如何首先对列进行排序并将索引排在第二位?
答案 0 :(得分:6)
您可以使用kind='mergesort'
按索引排序,然后按A列排序。
这是因为mergesort is stable。
res = df.sort_index().sort_values('A', kind='mergesort')
结果:
A
3 2
4 4
6 4
5 5
2 6
答案 1 :(得分:6)
使用来自numpy的df.iloc[np.lexsort((df.index, df.A.values))] # Sort by A.values, then by index
可能是另一种方式,但也快一点:
A
3 2
4 4
6 4
5 5
2 6
结果:
timeit
与%%timeit
df.iloc[np.lexsort((df.index, df.A.values))] # Sort by A.values, then by index
比较:
1000 loops, best of 3: 278 µs per loop
结果:
%%timeit
df.reset_index().sort_values(by=['A','index']).set_index('index')
再次使用重置索引和设置索引:
100 loops, best of 3: 2.09 ms per loop
结果:
{{1}}
答案 2 :(得分:0)
其他答案很好。我将提出另一个选择,即首先使用rename_axis为索引提供名称,然后在sort_values
中引用它。我尚未测试性能,但希望可接受的答案仍然更快。
df.rename_axis('idx').sort_values(by=['A', 'idx'])
A
idx
3 2
4 4
6 4
5 5
2 6
如果需要,可以随后使用df.index.name = None
清除索引名称。