如何基于已生成的布尔值结果绘制满足四类条件的柱状图
多条件学生群体统计与四分类柱形图实现
场景与原始数据
现有pandas DataFrame 结构如下:
Students Subject Mark 1 M F 7 4 3 7 2 I 5 6 3 M F I S 2 3 0 4 M 2 2 5 F M I 5 1 6 I M F 6 2 3 7 I M 7
需要按四类学生群体统计人数,绘制对应柱形图:
- Subject列包含3个及以上独立学科字符
- Mark列中至少存在一个成绩值为3
- 同时满足上述两个条件
- 上述两个条件均不满足
实现步骤
此前生成的布尔判断序列完全可以做计数统计,不需要额外转换格式,具体操作流程如下:
- 定义两个独立的判断逻辑,存为独立的布尔 Series 变量:
# 判断Subject列独立学科数≥3 cond_subject = df["Subject"].str.count("\w+") >= 3 # 判断Mark列存在至少一个值为3 cond_mark = df["Mark"].str.count("3") >= 1 - 直接利用布尔值的数值特性计算四个类别的样本量:布尔值中
True等价于数值1、False等价于数值0,直接对布尔序列求和就能得到满足条件的样本数,比调用value_counts()更简洁:- Subject列字符数≥3的样本数:
cond_subject.sum() - Mark列存在3分的样本数:
cond_mark.sum() - 同时满足两个条件的样本数:
(cond_subject & cond_mark).sum() - 两个条件都不满足的样本数:
(~cond_subject & ~cond_mark).sum()
- Subject列字符数≥3的样本数:
- 把四个类别的计数整理为标准可绘图结构:
plot_stats = pd.Series( [cond_subject.sum(), cond_mark.sum(), (cond_subject & cond_mark).sum(), (~cond_subject & ~cond_mark).sum()], index=["Subject≥3个字符", "Mark存在3分", "同时满足两条件", "两条件均不满足"] ) - 直接调用pandas内置绘图接口生成目标柱形图:
plot_stats.plot(kind="bar", rot=0, title="不同条件分组的学生数量统计")
常见报错说明:如果之前对布尔序列调用方法失败,通常是因为布尔判断结果没有被正确赋值为独立的Series对象,只是临时表达式结果,只要将判断逻辑绑定为明确变量,即可正常使用所有Series支持的方法。
内容的提问来源于stack exchange,提问作者gens_me
相关产品推荐
相关产品推荐

