You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas多列排序求助:按指定规则排B列+升序排C列

解决DataFrame多列自定义排序的方案

这是个很实用的自定义排序需求,咱们可以借助pandas的Categorical类型来实现B列的指定顺序排序,再结合C列的升序要求,完美达成你的目标。以下是完整的实现步骤和代码:

步骤说明

  1. 定义B列的自定义排序优先级:明确指定April→August→December的顺序,其余值(比如NaN)自动排在末尾
  2. 转换B列为有序分类类型:让pandas识别这个自定义顺序
  3. 多列排序:先按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:32:39