如何按特定规则对DataFrame的字母列排序(A00、B00等)
解决DataFrame列按「单字母前缀优先、双字母前缀后置」排序的问题
问题场景
现有DataFrame列值如下:
A00 B00 AA0 BA0 AB0 C00 Z00
期望排序后结果:
A00 B00 C00 Z00 AA0 AB0 BA0
直接使用sort_values()会得到字典序结果(单字母与对应双字母值相邻),不符合需求,需要将所有单字母前缀的组排在双字母前缀组的前面。
解决方案
核心思路:先按前缀字母的长度排序(长度短的优先),再在同一长度组内按字典序排序。
方法1:使用辅助列(兼容旧版pandas)
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({'col': ['A00', 'B00', 'AA0', 'BA0', 'AB0', 'C00', 'Z00']}) # 添加辅助列:提取前缀字母的长度 df['prefix_length'] = df['col'].str.extract('([A-Za-z]+)').str.len() # 先按前缀长度升序,再按原列值升序排序,最后删除辅助列 sorted_df = df.sort_values(by=['prefix_length', 'col']).drop('prefix_length', axis=1) # 输出结果 print(sorted_df['col'].tolist()) # 输出:['A00', 'B00', 'C00', 'Z00', 'AA0', 'AB0', 'BA0']
方法2:使用sort_values的key参数(pandas 1.1.0+推荐)
无需额外辅助列,直接通过key指定排序规则:
import pandas as pd df = pd.DataFrame({'col': ['A00', 'B00', 'AA0', 'BA0', 'AB0', 'C00', 'Z00']}) # 排序规则:先按前缀字母长度,再按原列值 sorted_df = df.sort_values(by='col', key=lambda x: (x.str.extract('([A-Za-z]+)').str.len(), x)) print(sorted_df['col'].tolist()) # 输出:['A00', 'B00', 'C00', 'Z00', 'AA0', 'AB0', 'BA0']
原理说明
x.str.extract('([A-Za-z]+)'):提取每个列值中的连续字母前缀(比如A00提取A,AA0提取AA)- 排序时先按前缀长度分组:长度为1的单字母组排在前,长度为2的双字母组排在后
- 同一组内按原列值的字典序排序,保证单字母组内
A00→B00→C00→Z00、双字母组内AA0→AB0→BA0的顺序
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

