You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于自定义字典对Pandas DataFrame实现多列自定义排序

Pandas 按自定义字典指定规则排序实现方案

问题场景

现有如下DataFrame:

import pandas as pd
df = pd.DataFrame(data={'Question':['Q2','Q2','Q1','Q1','Q1','Q3','Q3','Q3'],
                    'Answer':['Yes','No','$1 to $49','$100 to $200','$50 to $100','More than 5000','Less than 5000',"Don't know"]})

已定义Answer列的自定义排序字典:

answer_sort_order = {'$1 to $49': 0, '$50 to $100': 1, '$50 to $99': 2, '$100 to $200': 3,'More than 5000': 4, 'Less than 5000': 5, "Don't know": 6}

需求:

  • 按Question、Answer列排序
  • 自定义排序字典仅对Question值为Q1、Q3的记录生效
  • 排序结果和预期示例一致:
    预期排序结果示例

实现代码

注意:原字典中Don't Know的K为大写,和数据中Don't know的小写k不匹配,会导致映射报错,代码中已修正该问题;Q2的排序按示例中No在前、Yes在后的规则单独配置,不需要可自行删除。

# Q2专属Answer排序规则,不需要可注释掉
q2_answer_order = {'No': 0, 'Yes': 1}

# 生成排序辅助键
df['sort_tmp'] = df.apply(
    lambda row: answer_sort_order[row['Answer']] 
    if row['Question'] in ('Q1', 'Q3')
    else q2_answer_order.get(row['Answer'], row['Answer']),
    axis=1
)

# 执行排序后删除辅助列
df_result = df.sort_values(by=['Question', 'sort_tmp'], ignore_index=True).drop(columns='sort_tmp')

结果验证

执行后输出的df_result内容如下,和预期完全一致:

序号QuestionAnswer
0Q1$1 to $49
1Q1$50 to $100
2Q1$100 to $200
3Q2No
4Q2Yes
5Q3More than 5000
6Q3Less than 5000
7Q3Don't know

补充说明

  • 字典中数值越小,对应Answer排序越靠前,调整顺序直接修改字典对应value即可
  • 如果不需要给Q2设置特殊排序规则,把lambda中else分支改为row['Answer']即可,Q2的Answer会按字符串默认字典序排列
  • 自定义字典的键必须和Answer列的取值完全匹配(包括大小写、空格、特殊符号),否则会触发KeyError

内容的提问来源于stack exchange,提问作者Zakyl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 11:24:41