如何按字母与数字混合顺序对DataFrame列排序并重索引
错误原因
你原来的代码提取排序键的逻辑完全错误:x[1:]是取列名字符串的第2位到末尾的子串,例如列名Round 1 Position取完是ound 1 Position,无法转为有效数值,自然得不到正确结果。
实现代码
你需要把排序键拆分为两个优先级:第一优先按Round后的数字升序,第二优先按后缀的自定义顺序(Position > Price > Score)排序,代码如下:
# 自定义排序规则 sorted_columns = sorted( df.columns, key=lambda col: ( int(col.split()[1]), # 第一排序键:提取轮次数字转整数,避免字符串排序10排在2前面的问题 # 第二排序键:给后缀指定权重,保证Position在前,Price中间,Score在后 {"Position": 0, "Price": 1, "Score": 2}[col.split()[-1]] ) ) # 重索引 df = df.reindex(sorted_columns, axis=1)
可选兼容处理
如果你的列名存在不在Position/Price/Score范围内的后缀,可以把第二排序键的字典改为带默认值的写法,避免报错:
key=lambda col: ( int(col.split()[1]), {"Position": 0, "Price": 1, "Score": 2}.get(col.split()[-1], 99) )
未定义的后缀会统一排在所有标准后缀的后面。
内容的提问来源于stack exchange,提问作者Fonti
相关产品推荐
相关产品推荐

