You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:57:03