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

如何将DataFrame中[A1,A2…H12]格式的Id列排序为[A1,B1…H12]?

问题:DataFrame中Id列按指定规则排序

需求

将DataFrame中格式为[A1,A2,A3,…,H12]的Id列,排序为[A1,B1,C1,…,H12]的顺序(即先按数字分组,同数字下按字母A到H排序)。

已尝试代码

用户尝试了以下代码,但未得到正确结果:

def key(row):
    match = re.match(r'(\d*)([A-H]\d+)', row)
    if match:
        num, letters = match.groups()
        return letters, int(num) if num else 0
    return row 

df['Id'] = sorted(df['Id'], key=key)

样本数据

原始Id列数据:

Id
A1
A2
A3
...
A12
B1
B2
...
H12

期望排序结果:

Id
A1
B1
C1
...
H1
A2
B2
...
H12

问题原因

原代码的正则表达式匹配逻辑错误:(\d*)([A-H]\d+)试图先匹配数字再匹配字母加数字,但实际Id格式是字母在前、数字在后,导致分组完全错误,排序key的逻辑自然无法生效。

解决方案

方法1:修正自定义排序Key

重新编写正则匹配逻辑,正确拆分Id的字母和数字部分,排序时先按数字升序,再按字母升序:

import re
import pandas as pd

def sort_key(id_str):
    # 匹配字母(A-H)和后续的数字部分
    match = re.match(r'([A-H])(\d+)', id_str)
    if match:
        letter, num = match.groups()
        # 先按数字排序,再按字母排序,实现同数字下字母A-H排列
        return (int(num), letter)
    return id_str

# 使用pandas的sort_values方法,对Id列应用自定义key排序
df_sorted = df.sort_values(by='Id', key=lambda x: x.apply(sort_key))

方法2:拆分列后排序(更直观)

如果不想用正则,可以拆分出字母和数字列,基于这两列排序后再删除临时列:

import pandas as pd

# 从Id中提取字母和数字部分
df['letter'] = df['Id'].str.extract(r'([A-H])')
df['num'] = df['Id'].str.extract(r'(\d+)').astype(int)

# 先按数字升序,再按字母升序排序,最后删除临时列
df_sorted = df.sort_values(by=['num', 'letter']).drop(['letter', 'num'], axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:52:41