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

如何实现DataFrame按列中数字实际值升序自然排序

解决DataFrame按字符串中数字实际值排序的问题

你需要的是自然排序(按数字实际大小而非字典序),可以用以下两种方法实现:

方法1:手动提取数字作为排序键

适合字符串格式固定的场景,通过正则提取下划线前的数字,转成数值类型后排序:

import pandas as pd
import re

# 示例DataFrame
df = pd.DataFrame(
    {'value': range(8)},
    index=['nv1_SRRxxxx', 'nv100_SRRxxxx', 'nv12_SRRxxxx', 'nv13_SRRxxxx', 'nv144_SRRxxxx', 'nv151_SRRxxxx', 'nv16_SRRxxxx', 'nv173_SRRxxxx']
)

# 提取字符串中的数字
def get_number(s):
    # 匹配'nv'后、下划线前的数字
    return int(re.findall(r'nv(\d+)_', s)[0])

# 按索引排序
df_sorted = df.sort_index(key=lambda idx: idx.map(get_number))
# 如果是按某列(比如列名是'sample')排序,用下面的代码:
# df_sorted = df.sort_values(by='sample', key=lambda col: col.map(get_number))

print(df_sorted.index)

输出结果会符合你的预期:

Index(['nv1_SRRxxxx', 'nv12_SRRxxxx', 'nv13_SRRxxxx', 'nv16_SRRxxxx',
       'nv100_SRRxxxx', 'nv144_SRRxxxx', 'nv151_SRRxxxx', 'nv173_SRRxxxx'],
      dtype='object')

方法2:使用natsort库(更通用)

natsort是专门处理自然排序的工具库,无需手动提取数字,直接处理字符串:

  1. 先安装库:
pip install natsort
  1. 排序代码:
import pandas as pd
from natsort import natsorted

# 示例DataFrame同方法1
df = pd.DataFrame(
    {'value': range(8)},
    index=['nv1_SRRxxxx', 'nv100_SRRxxxx', 'nv12_SRRxxxx', 'nv13_SRRxxxx', 'nv144_SRRxxxx', 'nv151_SRRxxxx', 'nv16_SRRxxxx', 'nv173_SRRxxxx']
)

# 按索引自然排序
df_sorted = df.loc[natsorted(df.index)]
# 如果是按列排序:
# df_sorted = df.loc[natsorted(df['sample'])]

print(df_sorted.index)

这个方法对各种包含数字的字符串排序都适用,无需适配格式。

内容的提问来源于stack exchange,提问作者Lim Chee Yit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:37:26