Pandas多列排序求助:按指定规则排B列+升序排C列
解决DataFrame多列自定义排序的方案
这是个很实用的自定义排序需求,咱们可以借助pandas的Categorical类型来实现B列的指定顺序排序,再结合C列的升序要求,完美达成你的目标。以下是完整的实现步骤和代码:
步骤说明
- 定义B列的自定义排序优先级:明确指定
April→August→December的顺序,其余值(比如NaN)自动排在末尾 - 转换B列为有序分类类型:让pandas识别这个自定义顺序
- 多列排序:先按C列升序,再按B列的自定义顺序排序
完整代码示例
import pandas as pd # 构造你提供的排序前的示例DataFrame data = { 'A': [354.7, 278.8, 283.5, 249.6, 95.5, 85.6, 55.4, 176.5, 104.8, 278.8, 238.7, 278.8, 152], 'B': ['April', None, 'December', None, 'April', 'August', 'August', 'December', 'August', None, 'April', 'April', 'December'], 'C': [4, 4, 2, 2, 2, 2, 4, 4, 8, 10, 8, 5, 8] } df = pd.DataFrame(data) # 定义B列的自定义排序顺序 custom_b_order = ["April", "August", "December"] # 将B列转换为有序Categorical类型,不在列表中的值会排在最后 df['B'] = pd.Categorical(df['B'], categories=custom_b_order, ordered=True) # 执行多列排序:先按C列升序,再按B列的自定义顺序排序 sorted_df = df.sort_values(by=['C', 'B'], ascending=[True, True]) # 重置索引(可选,让索引从0开始) sorted_df = sorted_df.reset_index(drop=True) print(sorted_df)
输出结果
运行后得到的结果和你给出的排序后示例完全匹配:
A B C 0 95.5 April 2 1 85.6 August 2 2 283.5 December 2 3 249.6 None 2 4 354.7 April 4 5 55.4 August 4 6 176.5 December 4 7 278.8 None 4 8 278.8 April 5 9 238.7 April 8 10 104.8 August 8 11 152.0 December 8 12 278.8 None 10
关键细节解释
- 使用
pd.Categorical时,ordered=True是核心,它告诉pandas这是一个有序分类,排序时会严格遵循你指定的categories顺序 - 不在
categories列表中的值(比如示例中的NaN/None)会被归为“其他”类,默认排在所有指定分类的后面 sort_values的ascending参数是一个列表,对应by参数中每一列的排序方向,这里C列升序、B列按自定义优先级升序
内容的提问来源于stack exchange,提问作者Sun
相关产品推荐
相关产品推荐

