含混合字母数字的DataFrame排序异常问题排查
问题解决:按自定义规则对Pin No列排序
问题分析
当前代码的排序逻辑仅以字母部分、数字部分作为排序依据,但忽略了字母部分的长度——单字母(如A、J)应排在双字母(如AA、AB)之前,这是导致输出不符合预期的核心原因。
修正方案
修改排序的key参数,让排序优先级依次为:
- 字母部分的长度(短的在前)
- 字母部分的字典序
- 数字部分的数值大小
修正后的代码
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
相关产品推荐
相关产品推荐

