Pandas Dataframe sort_values() 具有自定义键的多列

问题描述 投票:0回答:2

我尝试先按

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 表达式。我不知道如何解决这个问题,有什么指示吗?

python pandas dataframe sorting
2个回答
3
投票

两列都使用了

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

0
投票

对代码进行简单修复(使映射仅适用于“关卡”系列):

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])
© www.soinside.com 2019 - 2024. All rights reserved.