如何按长度和字母数字顺序对Pandas DataFrame字符串列排序
解决方案
要实现先按字符串长度、再按字母数字自然顺序的排序,你可以结合字符串长度和自然排序规则自定义排序键,具体步骤如下:
1. 准备工作
首先确保目标列是字符串类型(原始数据混合了数字和字母数字组合),并安装natsort库处理自然排序(它能正确区分数字的数值大小和字母的字典序):
pip install natsort
2. 具体代码
import pandas as pd from natsort import nats_keygen # 构造示例DataFrame input_data = [10, 100110, 222754430, 777000, "TEST10", 800022110, 210, 1960, 30, "TERM20", 22100, 22300, 487854750, "TEST20", 2200010, 220, 20, 22200, 1100, 2200020] df = pd.DataFrame({"col": input_data}) # 转换为字符串类型 df["col"] = df["col"].astype(str) # 自定义排序:先按字符串长度升序,再按自然排序规则 df_sorted = df.sort_values(by="col", key=lambda x: x.apply(lambda y: (len(y), nats_keygen()(y)))) # 查看结果 print(df_sorted["col"].tolist())
3. 结果说明
运行后会得到你预期的输出:
['10', '20', '30', '210', '220', '1100', '1960', '22100', '22200', '22300', 'TERM20', 'TEST10', 'TEST20', '100110', '777000', '2200010', '2200020', '222754430', '487854750', '800022110']
为什么之前的方法无效?
- 单纯按长度排序:只考虑了字符串长度,同长度内容会按默认字典序排列,无法处理字母数字组合的自然排序需求。
- 直接用
sort_values:默认是字典序排序,会忽略长度优先级,出现"100110"(长度6)排在"210"(长度3)前面的错误结果。
内容的提问来源于stack exchange,提问作者Trooprm32
相关产品推荐
相关产品推荐

