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

Pandas sort_values多列排序自定义key实现level优先、reviews次优先排序

问题根因
  • 你传入sort_values的key函数会被应用到by参数指定的所有列:当处理level列时映射规则生效,但处理reviews列时,所有字符串数值都不在你定义的ranking_level_sort字典中,映射后全为NaN,导致reviews列的排序规则完全失效。
  • 你的reviews列是字符串类型,就算key规则生效,默认也会按字典序排序,会出现"865" > "1314"的情况,和数值排序逻辑不符。
解决方案

方案1:使用辅助列(推荐,兼容性最高)

先新增临时辅助列存储level的排序权重,同时把reviews转成整数类型再排序,排序后可删除辅助列:

ranking_level_sort = {
    "Exceptional": 5,
    "Excellent": 4,
    "Very good": 3,
    "Good": 2,
    "Review score": 1,
    "None": 0
}

# 新增level排序权重辅助列
hotel["level_rank"] = hotel["level"].map(ranking_level_sort)
# 转换reviews为整数类型
hotel["reviews"] = hotel["reviews"].astype(int)

# 按指定规则排序
hotel_sorted = hotel.sort_values(by=["level_rank", "reviews"], ascending=[False, False])
# 删除辅助列、重置索引
hotel_sorted = hotel_sorted.drop("level_rank", axis=1).reset_index(drop=True)
hotel_sorted

方案2:单key函数区分列处理(适合不想修改原DataFrame的场景,要求Pandas≥1.1.0)

在key函数中通过x.name判断当前处理的列,分别应用不同的处理规则:

ranking_level_sort = {
    "Exceptional": 5,
    "Excellent": 4,
    "Very good": 3,
    "Good": 2,
    "Review score": 1,
    "None": 0
}

hotel_sorted = hotel.sort_values(
    by=["level", "reviews"],
    key=lambda x: x.map(ranking_level_sort) if x.name == "level" else x.astype(int),
    ascending=[False, False]
).reset_index(drop=True)
hotel_sorted

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:27:02