需求
现有一批成绩,要求统计各分数段人数并可视化。
要点
pandas.cut
可以把一组数据分割成离散的区间,并用为数据打上标签。然后配合pandas.value_counts
函数按值计数。
注意!仅能应用于Series
类型。
实现1
代码:
import pandas as pd
import matplotlib.pyplot as plt
# 分数
score = [22,51,60,80,70,96,89,95,68,88,85,79,100]
# 设置分段
bins=[0,60,70,80,90,101]
# 按分段离散化数据
segments=pd.cut(score,bins,right=False)
print(segments)
# 统计各分段人数
counts=pd.value_counts(segments,sort=False)
# 绘制柱状图
b=plt.bar(counts.index.astype(str),counts)
# 添加数据标签
plt.bar_label(b,counts)
plt.show()
输出:
[[0, 60), [0, 60), [60, 70), [80, 90), [70, 80), ..., [60, 70), [80, 90), [80, 90), [70, 80), [90, 101)]
Length: 13
Categories (5, interval[int64]): [[0, 60) < [60, 70) < [70, 80) < [80, 90) < [90, 101)]
实现2
代码:
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.family']='simhei'
# 分数
score = [22,51,60,80,70,96,89,95,68,88,85,79,100]
# 设置分段
bins=[0,60,70,80,90,101]
# 设置标签
labels=['不及格','及格','中等','良好','优秀']
# 按分段离散化数据
segments=pd.cut(score,bins,labels=labels)
print(segments)
# 统计各分段人数
counts=pd.value_counts(segments,sort=False)
# 绘制柱状图
b=plt.bar(counts.index,counts)
# 添加数据标签
plt.bar_label(b,counts)
plt.show()
输出为:
['不及格', '不及格', '不及格', '中等', '及格', ..., '及格', '良好', '良好', '中等', '优秀']
Length: 13
Categories (5, object): ['不及格' < '及格' < '中等' < '良好' < '优秀']