如何在保留category类型的前提下从图表中完全移除指定分类?
解决Category类型列筛选后绘图仍显示已移除分类的问题
当你用pandas筛选掉category列中的某个分类(比如Yellow)后,绘图时仍会出现该分类的刻度,核心原因是category类型会保留原始的完整类别集合,筛选操作只是过滤了行数据,但列的类别元数据没有同步更新,所以绘图工具会基于原始类别生成刻度。
不用转换数据类型的解决办法很简单:更新筛选后DataFrame中category列的类别集合,只保留当前存在的分类。
具体步骤与代码示例
先准备测试数据:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 创建带category列的DataFrame df = pd.DataFrame({ 'color': pd.Categorical(['Red', 'Blue', 'Yellow', 'Red', 'Blue', 'Blue']), 'count': [2, 3, 1, 2, 3, 1] }) # 移除Yellow类别的数据 filtered_df = df[df['color'] != 'Yellow']
关键操作:更新Category类别
直接调用cat.remove_unused_categories()自动清理掉未使用的分类:
filtered_df['color'] = filtered_df['color'].cat.remove_unused_categories()
如果需要自定义类别顺序,也可以手动指定保留的类别:
filtered_df['color'] = filtered_df['color'].cat.set_categories(filtered_df['color'].unique())
pandas条形图
此时再用pandas绘图,已移除的分类不会再显示:
filtered_df.plot(kind='bar', x='color', y='count', title='Pandas Bar Plot') plt.show()
seaborn条形图
同样适用于seaborn,刻度只会显示当前存在的分类:
sns.barplot(x='color', y='count', data=filtered_df) plt.title('Seaborn Bar Plot') plt.show()
原理说明
remove_unused_categories()会修改category列的categories属性,只保留当前DataFrame中实际出现的类别。绘图工具(不管是pandas还是seaborn)都会读取这个更新后的类别集合来生成x轴刻度,因此不会再出现已移除的分类标签。
内容的提问来源于stack exchange,提问作者johnjohn
相关产品推荐
相关产品推荐

