如何按指定规则对DataFrame中的字符串数字序列排序?
解决DataFrame中数字序列的自定义排序问题
需求
对DataFrame中的数字字符串序列按照指定的自定义顺序排序。
输入列表
lst = [ '6', '7', '8', '9', '9.1', '10.1', '10.2', '13.1', '13.2', '14.1', '14.2', '15.1', '15.2', '16.1', '16.2', '17', '11.1.1', '11.1.2', '11.2.1', '11.2.2', '12.1.1', '12.1.2', '12.2.1', '12.2.2' ]
期望输出
output = [ '6', '7', '8', '9', '9.1', '10.1', '11.1.1', '12.1.1', '11.1.2', '12.1.2', '13.1', '14.1', '15.1', '16.1', '10.2', '11.2.1', '12.2.1', '11.2.2', '12.2.2', '13.2', '14.2', '15.2', '16.2', '17' ]
当前代码问题
原代码仅通过拆分字段做简单排序,未匹配期望的复杂分组规则,无法得到目标结果。
解决方案
通过自定义排序键函数,精准匹配期望的排序逻辑,再基于该键完成排序:
import pandas as pd lst = [ '6', '7', '8', '9', '9.1', '10.1', '10.2', '13.1', '13.2', '14.1', '14.2', '15.1', '15.2', '16.1', '16.2', '17', '11.1.1', '11.1.2', '11.2.1', '11.2.2', '12.1.1', '12.1.2', '12.2.1', '12.2.2' ] df = pd.DataFrame(lst) def get_sort_key(s): parts = list(map(int, s.split('.'))) if len(parts) == 1: # 单个数字中17单独放在最后 if parts[0] == 17: return (3, parts[0]) else: return (0, parts[0], 0, 0) elif len(parts) == 2: first, second = parts if second == 1: # 第二级为1的元素,按第一级分为<=10和>=13两组排序 if first <= 10: return (0, first, 1, 0) else: return (0, first, 2, 0) else: # 第二级为2的元素,10.2优先,其余按第一级升序 if first == 10: return (1, 0, first, second) else: return (1, 2, first, second) else: # 三级结构元素,按第二级、第三级、第一级排序 first, second, third = parts if second == 1: return (0, first, 1, third) else: return (1, 1, first, third) # 生成排序键列 df['sort_key'] = df[0].apply(get_sort_key) # 按排序键排序 sorted_df = df.sort_values('sort_key') # 提取最终结果 output = sorted_df[0].tolist() print(output)
代码说明
get_sort_key函数根据元素的层级结构生成排序元组,元组从左到右优先级依次降低,完美匹配期望的分组排序规则- 通过
apply为每个元素生成排序键,再调用sort_values实现精准排序 - 最后提取原序列列得到目标输出
内容的提问来源于stack exchange,提问作者Vinay Kumar
相关产品推荐
相关产品推荐

