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

如何按字符串中的整数部分排序列表?求Pandas专属解决方案

问题分析与解决方案

首先来说你遇到的报错原因:在sorted函数的key参数里,你直接调用了r.search(m).group(1)——这里的m是你传入的整个列表varslist,但re.search需要的是单个字符串/字节对象,自然会抛出TypeError。原答案的写法是直接针对列表元素处理,你封装成函数时搞错了参数的作用对象:sorted的key应该是一个接收单个元素并返回排序键的函数,而不是直接计算出一个固定值。

修正后的独立函数

我们把key改成lambda函数,让它对列表中的每个元素单独提取数字部分,就能正常工作了:

import re

wholeregex = r"^[o][0-9]+" 
intregexkey = r"^[o]([0-9]+)" 

def strintkeysort(regex, lst):
    r = re.compile(regex)
    # 对列表里的每个元素x,提取o后面的数字转成int作为排序依据
    return sorted(lst, key=lambda x: int(r.search(x).group(1)))

# 测试示例
varslist = ["o3", "o8", "o10", "o1"]
varslist = strintkeysort(intregexkey, varslist)
print(varslist)  # 输出: ["o1", "o3", "o8", "o10"]

这个函数里的lambda x会遍历列表中的每个字符串,用预编译的正则提取数字部分转成整数,以此实现自然排序(避免字符串排序时o10排在o3前面的问题)。

Pandas专属实现方案

既然你是从DataFrame中提取列名,完全可以直接在Pandas里完成排序,不用转成列表再处理,更简洁高效:

方法1:纯Pandas原生实现

import pandas as pd

# 假设df是你的目标DataFrame
filtered_cols = df.filter(regex=wholeregex).columns
# 提取列名中的数字转为整数,排序后得到正确的列顺序
sorted_cols = filtered_cols.str.extract(intregexkey, expand=False).astype(int).sort_values().index
# 重新排列DataFrame的列(实现变量移动的需求)
df = df[sorted_cols]

方法2:用第三方库简化自然排序(可选)

如果你的列名格式更复杂,比如带有后缀,可以用natsort库实现通用的自然排序,不用写正则:

from natsort import natsorted

filtered_cols = df.filter(regex=wholeregex).columns
sorted_cols = natsorted(filtered_cols)
df = df[sorted_cols]

这个方法对各种带数字的字符串排序都很友好,比如"o2a"、"o10b"这类格式也能正确排序。

内容的提问来源于stack exchange,提问作者Soren V. Raben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:28:16