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

如何阻止dataframe.boxplot()自动排序并按原序列显示列?

解决Pandas箱线图按自定义顺序显示分类标签的问题

问题原因

你用map转换后的Column列是字符串类型,pandas绘制箱线图时会默认按字符串字典序排序,而非你想要的原始数字对应的映射顺序(1→L5,2→L4…14→M4)。另外你代码里的sorted()没有实际作用,既没传入参数也没赋值给变量。

修复步骤

方法1:将分类列设为有序分类(推荐)

用pd.Categorical指定自定义顺序,后续对该列做分组、绘图等操作都会保持设定好的序列:

import pandas as pd

# 定义和原始数字映射完全对应的标签顺序
custom_order = ['L5', 'L4', 'L3', 'L2', 'L1', 'M12', 'M11', 'M10', 'M9', 'M8', 'M7', 'M6', 'M5', 'M4']

# 映射标签并转为有序分类类型
df['Column'] = pd.Categorical(
    df['Column'].map({
        1: 'L5', 2:'L4', 3: 'L3', 4:'L2', 5:'L1',
        6:'M12', 7:'M11', 8:'M10', 9:'M9', 10:'M8',
        11:'M7', 12:'M6', 13:'M5', 14:'M4'
    }),
    categories=custom_order,
    ordered=True
)

# 绘制箱线图
df.boxplot(column=['Time'], by=['Column'])

方法2:绘图时直接指定顺序

如果不想修改列的类型,可在boxplot中通过order参数强制指定展示序列:

# 完成标签映射
df['Column'] = df['Column'].map({
    1: 'L5', 2:'L4', 3: 'L3', 4:'L2', 5:'L1',
    6:'M12', 7:'M11', 8:'M10', 9:'M9', 10:'M8',
    11:'M7', 12:'M6', 13:'M5', 14:'M4'
})

# 定义自定义顺序
custom_order = ['L5', 'L4', 'L3', 'L2', 'L1', 'M12', 'M11', 'M10', 'M9', 'M8', 'M7', 'M6', 'M5', 'M4']

# 绘图时传入order参数
df.boxplot(column=['Time'], by=['Column'], order=custom_order)

注意事项

  • 你之前代码中的sorted()属于无效代码,直接删除即可。
  • 有序分类的方式更适合后续对该列的持续分析,能避免重复指定顺序的麻烦。

内容的提问来源于stack exchange,提问作者AD_1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:37:07