现在有student.txt和score.txt数据文件,利用pandas求取每个班级的总分前三名的学生。然后将求取后的结果dataframe,利用seaborn完成数据可视化操作
首先导入pandas
import pandas as pd
然后利用pandas读取文件,将数据写入到dataframe里面
stuDF = pd.read_csv("./data/students.txt",names=['id','name','age','gender','clazz'])
scoreDF = pd.read_csv("./data/score.txt",names=['student_id','subject_id','score'])
查看一下数据
第一步:计算每个学生的总分
sumDF = scoreDF.groupby('student_id')['score'].agg('sum').reset_index().rename(columns={'score':'sum_score'})
sumDF.head()
第二步:将计算每个人成绩总和后的成绩表sumDF与学生表stuDF关联
stu_sumDF = stuDF.merge(sumDF,left_on='id',right_on='student_id',how='left').drop('student_id',axis=1)
stu_sumDF.head()
第三步:增加几个新的列,给每行数据打上序号,然后利用序号来进行排序
stu_sumDF['first_rank'] = stu_sumDF.groupby('clazz')['sum_score'].rank(method='first',ascending=False)
stu_sumDF['min_rank'] = stu_sumDF.groupby('clazz')['sum_score'].rank(method='min',ascending=False)
stu_sumDF['max_rank'] = stu_sumDF.groupby('clazz')['sum_score'].rank(method='max',ascending=False)
stu_sumDF['dense_rank'] = stu_sumDF.groupby('clazz')['sum_score'].rank(method='dense',ascending=False)
stu_sumDF['average_rank'] = stu_sumDF.groupby('clazz')['sum_score'].rank(method='average',ascending=False)
第四步:按照sum_socre列值和之前增加的新的列进行排序
stu_sum_sortDF = stu_sumDF.sort_values(['clazz','first_rank'])
stu_sum_sortDF.head(17)
最后一步:利用布尔索引,找到每个班的总分前三名
clazz_top3 = stu_sum_sortDF[stu_sum_sortDF['first_rank']<=3]
clazz_top3.head()
数据分析部分到这里结束,现在得到了一个放着最终结果的dataframe,现在要利用seaborn来对其进行可视化处理
seaborn官方api文档,在里面可以查到各种图的写法
第一步:导包
import seaborn as sns
import matplotlib.pyplot as plt
第二步:解决中文乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
第三步:利用直方图来完成可视化操作
sns.barplot(x='clazz',y='sum_score',hue='first_rank',data=clazz_top3)
plt.figure(figsize=(16,8))
plt.title("班级总分top3")
sns.barplot(x='clazz',y='sum_score',hue='first_rank',data=clazz_top3)
plt.xlabel("班级")
plt.ylabel("总成绩")
plt.ylim((450,650))
plt.show()
|