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

如何用Pandas按自定义顺序创建教育水平的直方图?

解决分类变量自定义顺序的直方图/条形图问题

我懂你的困扰——用数值映射会丢失原分类标签,直接用value_counts绘图又没法按想要的顺序排列对吧?其实最省心的办法是把edu转换成有序分类类型,这样不管做条形图(分类变量更适合用这个)还是直方图,都能严格遵循你想要的顺序,还能完整保留原标签。

下面给你分步演示可行的方案:

步骤1:将edu转为有序分类

先定义好你需要的自定义顺序列表,再用pd.Categorical把变量转换成有序分类,让Pandas和绘图库都能识别这个顺序:

import pandas as pd
import matplotlib.pyplot as plt

# 假设你的数据框是profile
custom_order = ['10', '11', '12', 'GED', '13']
profile['edu'] = pd.Categorical(profile['edu'], categories=custom_order, ordered=True)

步骤2:绘制符合顺序的条形图(推荐用于分类变量)

对于分类数据来说,条形图比直方图更贴合场景,现在直接用value_counts()配合plot.bar(),就能自动按你设定的顺序排列:

profile['edu'].value_counts().plot(kind='bar', title='教育水平分布')
plt.xlabel('教育水平')
plt.ylabel('人数')
plt.show()

这样出来的图x轴会严格按照10→11→12→GED→13的顺序显示,标签也是原分类值,完美解决你之前的两个问题。

如果你一定要用直方图(补充方案)

可以借助seaborn的histplot,它支持分类变量,并且能识别有序分类的顺序,也可以直接指定order参数:

import seaborn as sns

sns.histplot(data=profile, x='edu', order=custom_order)
plt.title('教育水平分布')
plt.show()

另外补充你之前尝试的第一种方法的优化:如果已经把edu映射成数值型edunum,也可以手动修改x轴标签来还原原分类:

# 先做好映射:10→0, 11→1, 12→2, GED→3, 13→4
profile['edunum'] = profile['edu'].map({'10':0, '11':1, '12':2, 'GED':3, '13':4})
ax = profile['edunum'].hist()
# 手动设置刻度和对应标签
ax.set_xticks([0,1,2,3,4])
ax.set_xticklabels(custom_order)
plt.xlabel('教育水平')
plt.show()

不过这种方法需要手动对应映射关系,不如直接用有序分类来得省心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:24:34