最近有点忙,好久没更新了,大家见谅!最后一关howell也做不出来
第1关:数据分析基础
1.将scores.xls文件读到名为df的dataframe中
2.添加平均分列:考勤、实验操作、实验报告的平均
3.输出前3行学生的平均分列表,控制小数点后两位
4.输出学生人数和班级数
5.分别输出实验报告中值、最高分、最低分
6.输出实验报告分最低的3位同学的姓名列表
第一关,第三问有更简洁的写法:
print(round(i,2) for i in list(df['平均分'])[0:3])
第四问,大家可以直接用shape函数,shape的输出结果是关于行和列的列表。也可以把序号便利一遍。
s=0for i in df['姓名']:s+=1print(s)
第六问,本来是输出数组的,这里是原本的代码,现在改为了dataframe,答案如最终代码所示:
df2=df.head(3)lis3=[]for i in df2['姓名']:lis3.append(i)str1=str(lis3)str2=str1.replace(',','')print(str2)
import pandas as pdimport warningswarnings.filterwarnings('ignore')# 1.将scores.xls文件读到名为df的dataframe中############begin############df=pd.read_excel('scores.xls')#############end##############2.添加平均分列:考勤、实验操作、实验报告的平均############begin############df['平均分']=(df['考勤']+df['实验操作']+df['实验报告'])/3#############end##############3.输出前3行学生的平均分列表,控制小数点后两位############begin############num1='%.2f'%(df.loc[0,'平均分'])num2='%.2f'%(df.loc[1,'平均分'])num3='%.2f'%(df.loc[2,'平均分'])lis1=[eval(num1),eval(num2),eval(num3)]print(lis1)#############end##############4.输出学生人数和班级数############begin############print(df.shape[0])s=0lis2=[]for i in df['班级名称']:if i not in lis2:s+=1lis2.append(i)print(s)#############end##############5.分别输出实验报告中值、最高分、最低分############begin############df=df.sort_values(by=['实验报告'],ascending=True)print(df.iloc[16,8])print(df.iloc[-1,8])print(df.iloc[0,8])#############end##############6.输出实验报告分最低的3位同学的姓名列表############begin############print(df.iloc[0:3,1])#############end#############
第2关:数据排序和检索
1.将scores.xls文件读到名为df的dataframe中
2.添加综合分列:考勤20%实验操作20%实验报告60%
3.按综合分降序和学号升序排序(临时排序,不改变原有顺序)
4.输出综合分最高的同学的姓名和学号(可能有多位同学)
5.输出性别为“男”而且实验报告>90的同学的姓名和综合分信息
6.将当前dataframe保存到文件scores_new.xls中
import pandas as pdimport warningswarnings.filterwarnings('ignore')# 1.将scores.xls文件读到名为df的dataframe中############begin############df=pd.read_excel('scores.xls')#############end##############2.添加综合分列:考勤20%实验操作20%实验报告60%############begin############df['综合分']=df['考勤']*0.2+df['实验操作']*0.2+df['实验报告']*0.6#############end##############3.按综合分降序和学号升序排序(临时排序,不改变原有顺序)############begin############df1=df.sort_values(by=['综合分','学号'],ascending=[False,True])#############end##############4.输出综合分最高的同学的姓名和学号(可能有多位同学)############begin############df2=df.loc[df['综合分']==max(df['综合分'])]print(df2[['姓名','学号']])#############end##############5.输出性别为“男”而且实验报告>90的同学的姓名和综合分信息############begin############print(df.loc[(df.性别=='男')&(df.实验报告>90),['姓名','综合分']])#############end##############6.将当前dataframe保存到文件scores_new.xls中############begin############df1.to_excel('scores_new.xls')#############end#############
第3关:分组统计及可视化
如果最后一关不能直接通过,记得把前两关运行一遍
import pandas as pdimport matplotlib.pyplot as pltimport warningswarnings.filterwarnings('ignore')plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)# 1.将scores_new.xls文件读到名为df的dataframe中############begin############df=pd.read_excel('scores_new.xls')#############end##############2.按性别统计实验报告分的均值,绘制条图,保存到图片文件filenamedef draw_bar(filename):plt.figure('fig1')############begin############n=df.groupby('性别')['实验报告'].mean()colors=['red','green']plt.bar(n.index,n.values,color=colors)plt.xticks(n.index,['女','男'])plt.xlabel('性别')plt.ylabel('成绩')plt.title('不同性别的实验报告平均成绩')for i,j in zip(n.index,n.values):plt.text(i,j+0.5, '%.2f'%j, ha = 'center')plt.savefig(filename)plt.show()#############end##############3.统计男女比例,绘制饼图,保存到图片文件filenamedef draw_pie(filename):plt.figure('fig2')############begin############n =df.groupby('性别').size()labels = ['女','男']plt.pie(n.values, labels=labels, autopct = '%1.2f%%')plt.savefig(filename)plt.show()#############end##############4.按班级统计各成绩均值,绘制折线图,保存到图片文件filenamedef draw_line(filename):plt.figure('fig3')############begin############a=df.groupby('班级名称')['考勤'].mean()b=df.groupby('班级名称')['实验操作'].mean()c=df.groupby('班级名称')['实验报告'].mean()d=df.groupby('班级名称')['综合分'].mean()x=['考勤','实验操作','实验报告','综合分']y1= [a[0],b[0],c[0],d[0]]y2= [a[1],b[1],c[1],d[1]]plt.plot(x,y1,label='一班',marker='*')plt.plot(x,y2,label='二班',marker='d')plt.legend()plt.savefig(filename)plt.show()#############end#############