如何对pandas DataFrame中含数字和文本的列按数值规则排序
pandas指定字符串列按多维度数值排序解决方案
核心逻辑:将指定列的字符串拆分出两个数值排序键,替代默认的字符串字典序排序,实现优先按第一个数字排序、再按第二个数字排序的需求。
方法1:使用sort_values的key参数(推荐,pandas 1.1.0及以上版本支持)
无需新增临时列,一步完成排序:
import pandas as pd # 示例数据 df = pd.DataFrame({'Name': ['12001 - Specimen 10', '12000 - Specimen 1', '12000 - Specimen 10', '12000 - Specimen 2', '12000 - Specimen 5', '12001 - Specimen 1', '12001 - Specimen 2'], 'Results': [2, 4, 2, 3, 10, 8, 2]}) # 排序逻辑 df_sorted = df.sort_values( by='Name', key=lambda col: ( col.str.split().str[0].astype(int), # 第一排序键:提取字符串首个片段转整数 col.str.split().str[-1].astype(int) # 第二排序键:提取字符串最后一个片段转整数 ) ) print(df_sorted)
运行输出:
Name Results 1 12000 - Specimen 1 4 3 12000 - Specimen 2 3 4 12000 - Specimen 5 10 2 12000 - Specimen 10 2 5 12001 - Specimen 1 8 6 12001 - Specimen 2 2 0 12001 - Specimen 10 2
方法2:新增临时排序列(兼容全版本pandas)
如果使用低于1.1.0版本的pandas,可以通过新增临时列完成排序后删除临时列:
# 生成两个数值型临时排序列 df['sort_key1'] = df['Name'].str.split().str[0].astype(int) df['sort_key2'] = df['Name'].str.split().str[-1].astype(int) # 按临时列排序后删除临时列 df_sorted = df.sort_values(by=['sort_key1', 'sort_key2']).drop(columns=['sort_key1', 'sort_key2'])
原问题说明
默认sort_values对字符串列按字典序排序,会出现'10'排在'2'前面的问题,将排序键转为整数类型后就会按照数值大小排序,完全匹配需求,全程仅使用pandas自带功能,无第三方依赖。
内容的提问来源于stack exchange,提问作者meakis
相关产品推荐
相关产品推荐

