Pandas中如何对值相等的Series按索引进行排序
Pandas 对value_counts结果按索引升序排列的原生实现
问题场景
给定测试Series:
import pandas as pd s1 = pd.Series([23,23,21,21,25,25,25])
默认执行s1.value_counts()会返回按频次降序排列的统计结果,索引为原Series的去重值,默认输出如下:
25 3 23 2 21 2 dtype: int64
需求为将结果按索引值(也就是原Series的被统计值)升序排列,替代手动转字典、反转键值排序的低效方案。
最优实现
不需要做任何字典转换、键值反转操作,直接使用Pandas原生的链式方法即可,无额外数据结构转换开销,执行效率远高于纯Python层面的字典处理逻辑:
# 方法1:拿到默认频次统计结果后直接按索引升序重排 result = s1.value_counts().sort_index(ascending=True)
执行后输出符合预期:
21 2 23 2 25 3 dtype: int64
也可以在调用value_counts时先关闭默认的频次排序规则,再做索引排序,逻辑更直观,性能和方法1几乎无差异:
# 方法2:关闭默认频次排序后按索引排序 result = s1.value_counts(sort=False).sort_index()
补充说明
- 两种方法均为Pandas底层优化过的实现,在十万级以上数据量场景下,比手动转字典重构的方案快数倍
- 如果需要调整排序方向,只需要修改
sort_index的ascending参数为False即可实现索引降序排列 - 如果需求是优先按频次降序、同频次下按索引升序,可以用
sort_values+sort_index的层级排序实现,可根据实际场景调整
内容的提问来源于stack exchange,提问作者Rishab S
相关产品推荐
相关产品推荐

