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

如何为Pandas多列分类数据绘制多标签分组计数柱状图

实现多列分类值计数分组柱状图的解决方案

问题原因

sns.countplot() 本身就支持对原始数据集的分类值自动做频次统计,不需要提前调用pd.Series.value_counts做聚合。你提前聚合后再传入接口,countplot会对聚合后的结果再做频次统计,自然无法输出3*5的分组柱状图效果。

完整实现代码

# 导入依赖
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 构造测试数据集
test = pd.DataFrame(np.array([
    ["Yes", "No", "No", "Yes", "Maybe"],
    ["Yes", "Yes", "Yes", "Maybe", "Maybe"],
    ["Maybe", "Yes", "Yes", "No", "No"],
    ["No", "Yes", "Maybe", "No", "No"],
    ["Maybe", "Maybe", "Maybe", "No", "Yes"],
    ])
    ,columns=['a','b','c','d', 'e'])

# 宽表转长表,适配seaborn绘图输入要求
df_melted = test.melt(var_name='字段名', value_name='取值')

# 绘制分组柱状图
plt.figure(figsize=(10,6))
# x为字段名(a-e),hue为取值(Yes/No/Maybe),实现分组效果
ax = sns.countplot(data=df_melted, x='字段名', hue='取值', palette='Set2')

# 可选:在柱子上添加计数标签
for container in ax.containers:
    ax.bar_label(container)

# 调整样式
plt.title('各字段取值分布统计')
plt.xlabel('字段')
plt.ylabel('出现次数')
plt.legend(title='取值类别', bbox_to_anchor=(1.01, 1), loc='upper left')
plt.tight_layout()
plt.show()

代码说明

  • 核心是使用pd.melt()将原始宽表转为长格式,把每个字段的所有取值都展开为独立行,这样countplot可以直接将字段名映射为x轴、取值映射为分组维度(hue),自动统计每个分组的出现次数。
  • 运行后即可得到a-e每个字段下对应Yes、No、Maybe三个计数柱子的效果,共15根分组柱子,符合预期。

内容的提问来源于stack exchange,提问作者이가원

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:06:04