如何对含版本号字符串列的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
相关产品推荐
相关产品推荐

