如何按照自定义顺序列表对DataFrame的指定列进行排序
实现方案
方案1:使用map生成排序辅助列(灵活度高,适配42行量级数据无压力)
先建立col1值和排序权重的对应关系,再按自定义顺序排序即可:
import pandas as pd # 示例数据构造,你可以替换为自己的DataFrame df = pd.DataFrame({ 'col1': ['v_1', 'v_2', 'v_3'], 'col2': [4, 3, 1] }) # 1. 建立col1值到对应权重的映射(如果规则固定可以直接提取后缀数字,不需要手动写) rank_map = {'v_1':1, 'v_2':2, 'v_3':3} # 2. 传入你自定义的排序顺序列表 custom_order = [3,1,2] # 3. 生成辅助排序列,排序后删除辅助列即可得到结果 df['sort_weight'] = df['col1'].map(rank_map) result = df.sort_values( 'sort_weight', key=lambda x: x.map({v:i for i,v in enumerate(custom_order)}) ).drop('sort_weight', axis=1)
方案2:使用有序Categorical类型(无需生成额外列)
直接将col1转为指定顺序的有序分类类型,再排序即可:
rank_map = {'v_1':1, 'v_2':2, 'v_3':3} custom_order = [3,1,2] # 按自定义顺序生成col1的分类顺序 cat_order = sorted(rank_map.keys(), key=lambda x: custom_order.index(rank_map[x])) # 转为有序分类后排序 df['col1'] = pd.Categorical(df['col1'], categories=cat_order, ordered=True) result = df.sort_values('col1')
如果你的col1值和权重的对应规则是固定的(比如v_后面的数字就是权重值),还可以简化映射逻辑,不用手动写rank_map:
# 直接提取col1后缀数字作为权重 df['sort_weight'] = df['col1'].str.split('_').str[1].astype(int) custom_order = [3,1,2] result = df.sort_values( 'sort_weight', key=lambda x: x.map({v:i for i,v in enumerate(custom_order)}) ).drop('sort_weight', axis=1)
内容的提问来源于stack exchange,提问作者EGM8686
相关产品推荐
相关产品推荐

