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

如何正确使用pandas sort_values的key参数对特殊格式列排序

解决pandas DataFrame按「数字优先+字符次之」排序的问题

错误原因

你遇到的TypeError是因为pandas的sort_values的key参数要求函数接收整个Series对象,而不是单个字符串元素。你写的alpha_numeric_sort_key是针对单个字符串设计的,直接传入会把整个Series传给re.findall,自然触发类型错误——而列表的sort方法的key参数是逐个处理元素,所以你的函数在列表排序时有效。

正确解决方案

要实现「数字优先级最高、数字后的字符次之」的排序规则,我们需要构造一个能处理整个Series的key函数,提取出两个排序维度:数字部分(转为整数)、数字后的字符部分,让sort_values先按数字排序,再按字符排序。

完整代码示例

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'Mutation': ['silent_C88G', 'A67D', 'B12A', 'silent_D100Z', 'C33B', 'A67C'],
    'OtherData': [10, 20, 30, 40, 50, 60]
})

def mutation_sort_key(series):
    # 提取字符串中的数字部分,转为整数(排序优先级1)
    numeric_key = series.str.extract(r'(\d+)', expand=False).astype(int)
    # 提取数字后的字母(排序优先级2)
    char_key = series.str.extract(r'\d+([A-Za-z])', expand=False)
    # 返回包含两个排序键的DataFrame,pandas会按顺序使用这些键排序
    return pd.DataFrame({'num': numeric_key, 'char': char_key})

# 执行排序,ignore_index重置索引
sorted_df = df.sort_values(by='Mutation', key=mutation_sort_key, ignore_index=True)
print(sorted_df)

输出结果

Mutation  OtherData
0           B12A         30
1           C33B         50
2           A67C         60
3           A67D         20
4    silent_C88G         10
5  silent_D100Z         40

关键说明

  • 使用Series.str.extract可以批量处理整个Series的字符串,避免逐个元素循环,效率更高。
  • 如果你的「第二个字符」指的是字符串开头的字母(而非数字后的字符),只需修改提取字符的正则:char_key = series.str.extract(r'([A-Za-z])\d+', expand=False)。
  • sort_values会按照返回的DataFrame的列顺序依次排序,所以先返回数字键,再返回字符键,就实现了「数字优先」的规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:50:17