Pandas问题:Categorical未按自定义顺序排序,反而按字母序排列
问题:按自定义subgroup顺序排序DataFrame
原始DataFrame
import pandas as pd df = pd.DataFrame({ 'maingroup': ['Citrus']*8, 'subgroup': ['Mandarin', 'Lemon', 'Kiwi', 'Lemon', 'Mandarin', 'Kiwi', 'Mandarin', 'Mandarin'], 'item': ['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh'], 'itemrank': [12, 22, 32, 35, 33, 42, 98, 99] })
需求
希望按照由itemrank升序推导的subgroup顺序对DataFrame排序,同时组内按itemrank升序排列。
尝试的代码(未达预期)
grp_list = df.sort_values(by=['itemrank'], ascending=True)['subgroup'].unique().tolist() # ['Mandarin', 'Lemon', 'Kiwi'] df['subgroup'] = pd.Categorical(df.subgroup, categories=grp_list, ordered=True)
错误输出
maingroup subgroup item itemrank Citrus Kiwi cc 32 Citrus Kiwi ff 42 Citrus Lemon dd 22 Citrus Lemon bb 35 Citrus Mandarin ee 12 Citrus Mandarin aa 33 Citrus Mandarin gg 98 Citrus Mandarin hh 99
期望输出
maingroup subgroup item itemrank Citrus Mandarin ee 12 Citrus Mandarin aa 33 Citrus Mandarin gg 98 Citrus Mandarin hh 99 Citrus Lemon dd 22 Citrus Lemon bb 35 Citrus Kiwi cc 32 Citrus Kiwi ff 42
解决方案
问题根源
- 仅将
subgroup转为有序分类,但未执行主动排序操作,DataFrame不会自动重排。 - 原
grp_list生成逻辑依赖行排序后的唯一值提取,若数据波动可能导致分组顺序错误,更稳妥的方式是按每个subgroup的最小itemrank确定顺序。
修正代码
# 按每个subgroup的最小itemrank升序,确定分组顺序 grp_list = df.groupby('subgroup')['itemrank'].min().sort_values().index.tolist() # 将subgroup转为有序分类 df['subgroup'] = pd.Categorical(df['subgroup'], categories=grp_list, ordered=True) # 执行排序:先按subgroup(自定义顺序),再按itemrank升序 df_sorted = df.sort_values(by=['subgroup', 'itemrank'], ascending=[True, True]) print(df_sorted)
说明
- 用
groupby提取每个分组的最小itemrank再排序,能稳定得到符合需求的分组顺序,避免数据波动带来的错误。 - 转为分类后必须调用
sort_values(),指定按subgroup和itemrank排序,才能得到期望的结果。
内容的提问来源于stack exchange,提问作者user12345
相关产品推荐
相关产品推荐

