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
相关产品推荐
相关产品推荐

