如何基于自定义字典对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内容如下,和预期完全一致:
| 序号 | Question | Answer |
|---|---|---|
| 0 | Q1 | $1 to $49 |
| 1 | Q1 | $50 to $100 |
| 2 | Q1 | $100 to $200 |
| 3 | Q2 | No |
| 4 | Q2 | Yes |
| 5 | Q3 | More than 5000 |
| 6 | Q3 | Less than 5000 |
| 7 | Q3 | Don't know |
补充说明
- 字典中数值越小,对应Answer排序越靠前,调整顺序直接修改字典对应value即可
- 如果不需要给Q2设置特殊排序规则,把lambda中else分支改为
row['Answer']即可,Q2的Answer会按字符串默认字典序排列 - 自定义字典的键必须和Answer列的取值完全匹配(包括大小写、空格、特殊符号),否则会触发KeyError
内容的提问来源于stack exchange,提问作者Zakyl
相关产品推荐
相关产品推荐

