如何按分隔符后首字符对Pandas DataFrame列排序?
按
_分隔符后内容对DataFrame列排序的问题解决 需求说明
需要将DataFrame的列按列名中_分隔符后的首字母排序,目标列顺序为:cat_A、apple_B、dog_C、car_D
错误代码及报错
以下是两种错误尝试及对应报错:
import pandas as pd df = pd.DataFrame() df.columns = ['apple_B','cat_A','dog_C','car_D'] # 错误尝试1:误用DataFrame的sort_values参数 df.columns.sort_values(by=df.columns.str.split('-')[1]) # 报错:TypeError: sort_values() got an unexpected keyword argument 'by' # 错误尝试2:分隔符错误+key函数返回形状不符 df.sort_index(axis=1, key=lambda s: s.str.split('-')[1]) # 报错:ValueError: User-provided `key` function must not change the shape of the array.
错误原因
df.columns是Index对象,其sort_values()方法没有by参数,该参数仅属于DataFrame的sort_values()方法。- 列名中实际分隔符是
_而非-,用split('-')无法正确拆分;同时直接取[1]会导致返回结果形状不符合key函数要求(需与输入列名数组形状一致)。
正确解决方案
方法1:使用sort_index的key参数(推荐)
修正分隔符,确保key函数返回同形状的结果:
import pandas as pd df = pd.DataFrame() df.columns = ['apple_B','cat_A','dog_C','car_D'] # 按_后的部分排序列 df_sorted = df.sort_index(axis=1, key=lambda col: col.str.split('_').str[1]) print(df_sorted.columns) # 输出:Index(['cat_A', 'apple_B', 'dog_C', 'car_D'], dtype='object')
方法2:手动排序列名后重排
# 对列名列表按_后的部分排序 sorted_cols = sorted(df.columns, key=lambda x: x.split('_')[1]) # 重新设置DataFrame的列顺序 df_sorted = df[sorted_cols] print(df_sorted.columns) # 输出:Index(['cat_A', 'apple_B', 'dog_C', 'car_D'], dtype='object')
关于后续尝试的说明
你后续尝试的代码是对行索引进行排序,再用相同索引排序列,这与需求不符。需求是排序列名,因此需要针对列名列表进行排序操作,而非行索引。
内容的提问来源于stack exchange,提问作者skiventist
相关产品推荐
相关产品推荐

