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

如何对含版本号字符串列的Pandas DataFrame进行自然排序?

Pandas按版本号字符串自然排序解决方案

原始数据

首先定义初始DataFrame:

import pandas as pd

df = pd.DataFrame({
    'a': ['abc_1.2.6','abc_1.2.60','abc_1.2.7','abc_1.2.9','abc_1.3.0','abc_1.3.10','abc_1.3.100','abc_1.3.11'], 
    'b': [1,2,3,4,5,6,7,8]
})

初始输出:

a           b
0   abc_1.2.6   1
1   abc_1.2.60  2
2   abc_1.2.7   3
3   abc_1.2.9   4
4   abc_1.3.0   5
5   abc_1.3.10  6
6   abc_1.3.100 7
7   abc_1.3.11  8

需求

需要对a列按版本号进行自然排序(按数字大小比较,而非字符串字典序),得到如下结果:

a           b
0   abc_1.2.6   1
1   abc_1.2.7   3
2   abc_1.2.9   4
3   abc_1.2.60  2
4   abc_1.3.0   5
5   abc_1.3.10  6
6   abc_1.3.11  8
7   abc_1.3.100 7

解决方案

方法1:自定义版本号转换函数(无需第三方库)

直接提取版本号并转为整数元组,以此作为排序键:

# 提取版本号并转换为整数元组
def get_version_tuple(s):
    # 拆分出下划线后的版本部分,再按点分割转整数
    return tuple(map(int, s.split('_')[1].split('.')))

# 按转换后的版本元组排序,重置索引
sorted_df = df.sort_values(
    by='a',
    key=lambda col: col.apply(get_version_tuple),
    ignore_index=True
)
print(sorted_df)

方法2:使用natsort库(更简洁)

natsort专门处理自然排序场景,先安装库:

pip install natsort

然后用以下代码排序:

from natsort import natsort_keygen

# 直接使用natsort的排序生成器作为key
sorted_df = df.sort_values(
    by='a',
    key=natsort_keygen(),
    ignore_index=True
)
print(sorted_df)

说明

直接使用df.sort_values(by=['a'], ignore_index=True)无效的原因是:字符串默认按字典序排序,会将'60'判定为小于'7'(因为'6'的ASCII码小于'7'),而自然排序会将版本号拆分为数字逐个比较,从而得到符合预期的结果。

内容的提问来源于stack exchange,提问作者doine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:17:28