如何将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
相关产品推荐
相关产品推荐

