如何按字符串中的整数部分排序列表?求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
相关产品推荐
相关产品推荐

