如何对DataFrame的Group列进行非字典序自定义排序?
自定义DataFrame字符串列的排序规则
原始DataFrame数据:
| Group | Value |
|---|---|
| SA | x |
| X | x |
| SAA | x |
| SB | x |
使用默认的df.sort_values('Group')排序后得到:
| Group | Value |
|---|---|
| SA | x |
| SAA | x |
| SB | x |
| X | x |
但期望的排序结果是:
| Group | Value |
|---|---|
| SA | x |
| SB | x |
| SAA | x |
| X | x |
解决方案
利用sort_values的key参数自定义排序规则,构造包含优先级的元组作为排序依据:
import pandas as pd # 构造原始DataFrame data = {'Group': ['SA', 'X', 'SAA', 'SB'], 'Value': ['x', 'x', 'x', 'x']} df = pd.DataFrame(data) # 自定义排序 df_sorted = df.sort_values( by='Group', key=lambda col: col.apply(lambda x: (0 if x.startswith('S') else 1, len(x), x)) ) print(df_sorted)
规则说明
排序元组的三个元素依次对应优先级:
- 是否以S开头:S开头的标记为0,非S开头标记为1,确保S开头的条目全部排在前面;
- 字符串长度:长度更短的条目优先,所以长度为2的
SA、SB排在长度为3的SAA之前; - 字符串本身:长度相同的S开头条目按字母顺序排序,保证
SA在SB前面。
输出结果完全符合期望的排序顺序。
内容的提问来源于stack exchange,提问作者Stella H
相关产品推荐
相关产品推荐

