我尝试先按
level
排序,然后按 reviews
排序。数据框 dtype
都是 str
。
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), ascending=[False, False])
hotel_sorted.reset_index(drop=True, inplace=True)
hotel_sorted
名字 | 价格 | 级别 | 评论 |
---|---|---|---|
迷你旅馆 - 双人间 - 带私人浴室 | 47 | 卓越 | 1 |
文莱帝国酒店 | 309 | 优秀 | 1464 |
海尔酒店 | 24 | 优秀 | 865 |
文莱丽筠酒店 | 120 | 优秀 | 1314 |
阿卜杜勒拉扎克酒店公寓 | 59 | 优秀 | 129 |
名字 | 价格 | 等级 | 评论 |
---|---|---|---|
迷你旅馆 - 双人间 - 带私人浴室 | 47 | 卓越 | 1 |
文莱帝国酒店 | 309 | 优秀 | 1464 |
文莱丽筠酒店 | 120 | 优秀 | 1314 |
海尔酒店 | 24 | 优秀 | 865 |
阿卜杜勒拉扎克酒店公寓 | 59 | 优秀 | 129 |
到目前为止,我已经成功地按
level
排序,并且后面没有跟着reviews
。 key
中的 sort_values
参数只能采用一个 lambda 表达式。我不知道如何解决这个问题,有什么指示吗?
两列都使用了
map
,因此在 reviews
中没有匹配并返回 NaN
,因此需要将它们替换为 fillna
中的原始值,例如:
hotel_sorted = hotel.sort_values(by=["level", "reviews"],
key=lambda x: x.map(ranking_level_sort).fillna(x),
ascending=False)
hotel_sorted.reset_index(drop=True, inplace=True)
print (hotel_sorted)
name price level reviews
0 Miniinn - Double Room with Private Bathroom 47 Exceptional 1
1 The Empire Brunei 309 Excellent 1464
2 Radisson Hotel Brunei 120 Excellent 1314
3 Higher Hotel 24 Excellent 865
4 Abdul Razak Hotel Apartment 59 Excellent 129
对代码进行简单修复(使映射仅适用于“关卡”系列):
hotel_sorted = hotel.sort_values(by=["level", "reviews"], key=lambda x: x if x.name!='level' else x.map(ranking_level_sort), ascending=[False, False])