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

含混合字母数字的DataFrame排序异常问题排查

问题解决:按自定义规则对Pin No列排序

问题分析

当前代码的排序逻辑仅以字母部分、数字部分作为排序依据,但忽略了字母部分的长度——单字母(如A、J)应排在双字母(如AA、AB)之前,这是导致输出不符合预期的核心原因。

修正方案

修改排序的key参数,让排序优先级依次为:

  1. 字母部分的长度(短的在前)
  2. 字母部分的字典序
  3. 数字部分的数值大小

修正后的代码

import pandas as pd
import re

def split_pin(pin):
    match = re.match(r"([A-Za-z]+)(\d+)", pin)
    if match:
        alphabetic_part = match.group(1).upper()  # 统一大写避免大小写干扰
        numeric_part = int(match.group(2))
        return (alphabetic_part, numeric_part)
    else:
        return (pin, 0)

def main():
    df = pd.DataFrame({
        "Pin No": ['J11', 'J1', 'A2', 'A11', 'A1', 'AA2', 'AB2'],
        "Pin Name": ['pin1', 'pin2', 'pin3', 'pin4', 'pin5', 'pin6', 'pin7']
    })
    
    df['Pin No Split'] = df['Pin No'].apply(split_pin)
    
    # 调整排序key:先按字母长度,再字母,再数字
    df_sorted = df.sort_values(
        by='Pin No Split',
        key=lambda x: x.apply(lambda y: (len(y[0]), y[0], y[1]))
    ).drop(columns=['Pin No Split']).reset_index(drop=True)
    
    print(df_sorted.to_string(index=False))  # 去掉索引更贴近期望输出格式

if __name__ == "__main__":
    main()

输出结果

Pin No Pin Name
    A1     pin5
    A2     pin3
   A11     pin4
    J1     pin2
   J11     pin1
   AA2     pin6
   AB2     pin7

关键说明

  • 新增len(y[0])作为第一排序条件,确保单字母Pin先于双字母Pin排列
  • 将字母部分转成大写(upper()),避免大小写差异导致的排序异常
  • 使用to_string(index=False)输出,去掉自动生成的索引列,更匹配期望格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 12:07:12