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

如何在Pandas中按索引的数字部分自定义排序行?

嘿,这个需求我之前也遇到过,刚好有几个不用提前移除前缀字符的简洁解决方案,给你参考:

方法1:适配旧版pandas(无sort_index key参数)

如果你的pandas版本比较旧(1.1.0之前),sort_index确实不支持自定义排序函数,那可以借助sort_values和临时提取的数字序列来实现:

import pandas as pd

# 示例DataFrame
df = pd.DataFrame({'data': [10, 20, 30, 40]}, index=['b1', 'a20', 'b2', 'a21'])

# 按索引中的数字部分排序
sorted_df = df.loc[
    df.index.to_series()
    .apply(lambda idx: int(idx[1:]))  # 提取索引的数字部分转成整数
    .sort_values()
    .index
]

原理很简单:把索引转成Series,提取数字部分作为排序依据,排好序后再用原索引重新定位DataFrame的行,完全不会改动原索引。

方法2:新版pandas直接用sort_index的key参数

如果你的pandas是1.1.0及以上版本,其实官方已经给sort_index加了key参数,这就更省事了:

sorted_df = df.sort_index(key=lambda idx: idx.str[1:].astype(int))

直接给key传一个匿名函数,提取索引的数字部分转成整数,pandas会自动用这个值来排序索引,代码简洁到不行。

方法3:用natsort库处理更复杂的格式

要是你的索引前缀不止一个字符(比如'ab12'这种),或者格式更灵活,推荐用第三方库natsort的自然排序功能,它能自动识别字符串里的数字片段:

先安装库:

pip install natsort

然后使用:

from natsort import natsorted

sorted_df = df.loc[natsorted(df.index)]

这个方法通用性极强,不管前缀是几个字符,只要后面跟着数字,都能精准按数字大小排序,代码也超简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 06:23:24