资源简介 8.1 利用pandas进行数据统计学习目标 1.对DataFrame对象按列进行公式计算,描述DataFrame对象数据以字典中键为列的存储形式。2.对每个键对应一列数据多个值进行切片,掌握取出不同数据区域内容的方法。3.运用函数统计对象的平均值等操作,运用排序函数对数据进行有序排列。4.运用groupby函数对数据进行分组的方法,并在分组的基础上进行数据统计。 (2023年1月浙江省选考)小红收集了部分城市2021年全年每天PM2.5、PM10、CO浓度数据,每天的数据分别保存在以8位日期字符串命名的CSV文件中,部分文件如图a所示,每个文件记录了一天24小时的监测数据,示例如图b所示。为统计分析城市A全年各月份PM2.5的月平均浓度(当月的日平均浓度的平均值),编写Python程序。请回答下列问题:(1)定义pmday函数,功能为:读取某天的CSV文件,返回城市A当天PM2.5的日平均浓度。函数代码如下,划线处应填入的代码为 (单选,填字母)。 A.df['类型']=='PM2.5'B.df['类型'=='PM2.5']C.df[df['类型']]=='PM2.5'D.df[df['类型']=='PM2.5']import pandas as pddef pmday(dayfile): df=pd.read_csv(dayfile) #读取文件dayfile中的数据 df= return df['城市A'].mean() #返回城市A当天PM2.5的日平均浓度(2)统计城市A各月份PM2.5的月平均浓度并绘制线形图,部分Python程序如下,请在划线处填写合适的代码。import matplotlib.pyplot as plt def tstr(t): if t<10: retrun '0'+str(t) else: retrun str(t)pm=[0]*12mdays=[31,28,31,30,31,30,31,31,30,31,30,31]#2021年每月天数for m in range(12): sm=0;mstr=tstr(m+1) for d in range(① ): dstr=tstr(d+1) dayfile='2021'+mstr+dstr+'.csv' sd=pmday(dayfile) ② pm[m]=sm/mdays[m]x=[1,2,3,4,5,6,7,8,9,10,11,12]y=③ plt.plot(x,y)#绘制线性图#设置绘图参数,显示如图c所示线形图,代码略(3)城市A 2021年PM2.5年平均浓度为34.6微克/立方米。由图c可知,城市A 2021年PM2.5月平均浓度超过年平均浓度的月份共 个。 pandas有Series和DataFrame两种对象,这两种对象均有index和values属性,Series对象的values是一维的,DataFrame的values是二维的,因此DataFrame对象比Series对象多一个columns属性,可以理解为index表示行号,columns表示列名。pandas处理的对象主要是DataFrame,取出DataFrame中的一列,降维为Series对象,可以用list函数转换为列表,对某列的值进行切片,可以转换为一个数值。可以对记录选取、筛选和分组操作,灵活地区分不同类型的数据,可以对记录进行排序操作,实现数据的有序显示。可以对各条记录的字段进行遍历,统计符合要求字段值的数量、总和、平均值以及最值。例1 某学院举行运动会,比赛设跳高、100米等项目,每个项目分男子组和女子组。现要进行报名数据处理和比赛成绩分析。请回答下列问题:(1)运动会报名规则为:对于每个项目的男子组和女子组,每个专业最多各报5人(如“软件工程”专业在男子跳高项目中最多报5人)。软件工程专业的报名数据保存在DataFrame对象df中,如图a所示。若要编写Python程序检查该专业男子跳高项目报名是否符合规则,下列方法中,正确的是 (单选,填字母)。 A.从df中筛选出性别为“男”的数据dfs,再从dfs中筛选出项目为“跳高”的数据,判断筛选出的数据行是否超过5行B.对df中数据按性别排序并保存到dfs中,再从dfs中筛选出项目为“跳高”的数据,判断筛选出的数据行是否超过5行C.从df中筛选出项目为“跳高”的数据dfs,判断dfs中是否有连续5行以上的男生数据(2)运动员比赛成绩的部分数据如图b所示。根据已有名次计算得分,第1名至8名分别计9,7,6,5,4,3,2,1分,第8名之后计0分。实现上述功能的部分Python程序如下,请在程序中划线处填入合适的代码。import pandas as pdimport matplotlib.pyplot as plt#读取如图b所示数据,保存到DataFrame对象df1中,代码略f=[9,7,6,5,4,3,2,1]for i in range(0,len(df1)): rank=df1.at[i,"名次"] #通过行、列标签取单个值 score=0 if rank<=8: df1.at[i,"得分"]=score(3)根据上述 df1中的得分数据,统计各专业总分,绘制如图c所示的柱形图,实现该功能的部分Python程序如下:df2=df1.groupby(" ",as_index=False).sum() #分组求和 #设置绘图参数,代码略plt.bar(x,y)①请在程序中划线处填入合适的代码。②程序的方框中应填入的正确代码为 (单选,填字母) A.x=df1["专业"]y=df1["总分"]B.x=df2["专业"]y=df2["得分"]C.df1["专业"]="专业"df1["总分"]="总分"D.df2["专业"]="专业"df2["得分"]="得分"变式1 小明通过调查问卷收集了某餐厅近期上新菜品的顾客满意度情况数据,一周的调查结果分别存储在“day1.csv”、“day2.csv”等文件中(如图a所示),每个文件部分界面如图b所示。为统计分析新菜品点菜人数及各满意程度,编写Python程序,回答下列问题:点菜数 满意数 一般数 不满意数蕉蕉咸蛋黄焗虾 87 76 9 2顺德沙姜走地鸡 105 92 8 5生啫蒜蓉粉丝虾 60 35 18 7葱烧酱啫牛肉粒 68 47 20 1图c(1)定义fun函数,实现统计某天某个新菜品的点菜数及满意、一般、不满意的数量,请在划线处填入合适的代码。import pandas as pddef fun(file,menu): #参数menu列表存储各种菜品名称。字典ans是以菜品为键,对应的值是一个列表,有点菜数及满意、一般、不满意共4个值。 x=["满意","一般","不满意"] df=pd.read_csv(open(file)) #读取csv文件中的数据 ans[menu][0]+=df[menu].① for i in df.index: for j in range(len(x)): if df.at[i,menu]==x[j]: ② break(2)统计一周每个新菜品的点菜数,满意、一般和不满意数,程序运行结果如图c所示。实现上述功能Python程序如下,请在程序中划线处填入合适的代码。ans={"蕉蕉咸蛋黄焗虾":[0,0,0,0],"顺德沙姜走地鸡":[0,0,0,0],"生啫蒜蓉粉丝虾":[0,0,0,0],"葱烧酱啫牛肉粒":[0,0,0,0]} #ans中存放每个菜品对应的点菜数、满意数、一般数和不满意数for i in : filename="day"+str(i)+".csv" for menu in ans: fun(filename,menu)df1=pd.DataFrame(ans,index=["点菜数","满意数","一般数","不满意数"]) #利用字典ans创建df1对象。df1=df1.T #将df1对象进行行列转置print(df1)(3)计算每道菜品“满意率”,按照“满意率”升序排序后绘制柱形图,如图d所示:import matplotlib.pyplot as pltdf1["满意率"]=df1.满意数/df1.点菜数*100df2=df1.sort_values(" ") plt.title("餐厅新菜品满意率情况")plt.bar( ,label="满意率(%)")plt.legend();plt.show()①请在程序划线处填入合适的代码。②程序的方框中应填入的正确代码为 (单选,填字母)。 A.df1.index,df1.满意率B.df2.index,df2["满意数"]C.df2.index,df2.满意率例2 学校食堂以服务质量进行了调查问卷,调查项目共5项(具体内容略)。12个班级的调查结果分别存储在“dy01.csv”“dy02.csv”等文件中(如图a所示),每个文件部分界面如图b所示。现需要分析每个问题选“A”的情况,采用Python编制程序代码,请回答下列问题。(1)定义fun_A函数实现统计某个班级5个问题的选“A”的人数,请在划线处填入合适代码。import pandas as pddef fun_A(file): df=pd.read_csv(file) A_list=[] for col in df.columns[1:]: A_list.append(c) return A_list(2)统计12个班级每个问题选“A”的总人数,请在划线处填入合适代码。ans_list=[]s="010203040506070809101112"for i in range(0,len(s)-1,2): filename="dy"+ ① +".csv" res=fun_A(filename) ans_list.append(res)x=["问题1","问题2","问题3","问题4","问题5"]y=[0,0,0,0,0]for i in range(5): s=0 for j in range(12): ② y[i]=s(3)根据上述统计的得分数据,统计每个问题选“A”的数量,绘制如图c所示的柱形图,请在划线处填入合适代码。import matplotlib.pyplot as pltplt.title("每个问题选A的总人数")plt.bar(① ,② ) #显示图表,代码略变式2 为统计分析不同年级学生名字中的常用字,小王同学收集了本校所有学生的名字,并以入学年份为文件名分别保存在Excel文件中,文件如图a所示,每个文件包含了学生的年级、姓名和性别信息,如图b所示。编写Python程序。请回答下列问题:(1)定义getname函数,功能为:读取某年级的Excel文件,找出文件中同性别的学生,将学生姓名中的每个字(不包含姓氏,没有复姓学生)提取出来存储在列表mz中并返回列表。函数代码如下,请在划线处填写合适的代码。def getname(nj,xb): mz=[] df=pd.read_excel(nj+"学生名单.xlsx") for i in df.index: xm=df.at[i,"姓名"] if ① : for m in xm[1:]: mz.append(m) return ② (2)小王想统计女生名字中出现最频繁的10个字,部分Python程序如下,请在划线处选择合适的代码。import pandas as pdxb=input("请输入性别:") #输入性别"女"nianji=["2020级","2021级","2022级"]mzs=[] #存储姓名中的字for nj in nianji: mzs=mzs+getname(nj,xb)data={'字':mzs,'个数':[1]*len(mzs)}df1=pd.DataFrame(data)df2=df1.groupby("字",as_index=False).count() #统计每个字出现的次数df3= 划线处应选择的代码是 (单选,填字母)。 A.df2.sort_values("个数",ascending=True)[:10]B.df2.sort_values("字",ascending=False).tail(10)C.df2.sort_values("字",ascending=True).tail(10)D.df2.sort_values("个数",ascending=False).head(10)(3)将统计结果(10个最频繁的字)绘制成柱形图,部分Python程序如下,请在划线处填写合适的代码。import matplotlib.pyplot as pltplt.title(xb+"生取名常用字")plt.bar(df3.字, ) plt.show()1.管理员从停车系统中导出了3月份每天的停车记录,如图a所示,每天的停车记录内容格式如图b所示(进出标记为0表示驶入,1表示驶出,停车记录已按进出时间升序排列)。为统计停车场3月份每天的收入(只有驶入或驶出记录的车辆不参与计费),编写Python程序。(1)定义readdata函数,功能为:读取某一车牌车辆当天的进出时间记录,返回该车辆当天的停车总费用。参数data为该车牌当天的进出时间记录。函数代码如下,请回答下列问题:①程序段中加框处应填入的代码为 (单选,填字母)。 A.data.进出标记[p]==0B.data.进出标记[p-1]==0 and data.进出标记[p]==1C.data.进出标记[p+1]==1D.data.进出标记[p]==0 and data.进出标记[p+1]==1②请在程序段划线处填入合适的代码。def catime(t1,t2): #计算时间t1与时间t2之间的时间差并计算本次停车的费用,函数返回停车费用,代码略。def readdata(data): m=len(data) p=0;cost=0;total=0 while p if ① : cost=catime(data.进出时间[p],data.进出时间[p+1]) total+=cost p+=1 ② return total(2)统计停车场3月份每天的收入并绘制柱形图,部分Python代码如下,请在划线处填入合适的代码。n=31;dic={}for i in range(1,n+1): ① fname="3月"+str(i)+"日.xlsx" df=pd.read_excel(fname) df_g=df.groupby("车牌").进出标记.count() for k in df_g.index: #只有一条驶入或驶出记录的车辆不参与计费 if ② : data=df[df.车牌==k] dic[i]+=readdata(data)#绘制3月份整体收入图表并显示,代码略。(3)已知每月分为3个时间段,1-10日称为上旬,11-20日称为中旬,21-30(31)日称为下旬。则由图c可知,该停车场3月份 (选填:上旬/中旬/下旬)收入总和最高。 2.小明为了研究某地近十年每月的温差变化,编写Python程序。以2023年4月为例,该月每天的温度数据分别保存在以8位日期字符串命名的excel文件中,部分文件如图a所示,每个文件记录了一天24小时的温度数据,如图b记录了4月28日的数据。(1)定义dv函数,功能为:读取某天的excel文件,返回当天最高温度与最低温度的差值。函数代码如下,划线处应填入的代码为 (单选,填字母)。 A.df["温度"].head(1)-df["温度"].tail(1)B.df["温度"].(max()-min())C.df["温度"].max()-df["温度"].min()D.df["温度"].(head(1)-tail(1))def dv(dayfile): df=pd.read_excel(dayfile) diff= return diff(2)定义find函数,功能为:用字典创建DataFrame对象,并筛选出4月份温差大于13的日期,输出结果如图c所示,请在划线处填入代码。日期 温差3 0404 13.19 0410 13.115 0416 13.317 0418 13.827 0428 15.5图cdef find(r,t): dic={"日期":r,"温差":t} df1=pd.DataFrame(dic) df2= return df2(3)绘制4月份每天的温差柱形图如图d,部分Python程序如下,请在划线处填写合适的代码。def tstr(t): if t<10: return '0'+str(t) else: return str(t)td=[];date=[]for i in range(30): dstr=tstr(① ) dayfile='202304'+dstr+'.xlsx' date.append(dayfile[4:8]) td.append(② ) #设置绘图参数,代码略plt.bar(date,③ ) plt.show()3.某社区开展“我运动,我健康”趣味保龄球活动,比赛规则为:每人投掷3个球,击打15米外的10个瓶子,按照三次击倒总个数累计得分,击倒1个瓶子计1分。姓名 组别 第1次 投掷个数 第2次 投掷个数 第3次 投掷个数 得 分 排 名孙*正 男子 8 6 8魏*恬 女子 6 6 9陈*远 男子 5 7 8邢*儿 女子 8 5 7陈*妤 女子 8 3 6姚*元 男子 2 8 7史*妮 女子 5 3 6吕*家 男子 2 8 6袁*泉 男子 3 7 5图a(1)定义cal函数,score为得分,返回该得分在list数组中的排名。例如score=3,list=[1,3,3,4,4],则返回得分3的排名为3。请在程序中划线处填入合适的代码。def cal(score,list): rank=1 for i in list: if : rank+=1 return rank(2)参加活动的部分数据如图a所示,根据得分计算排名,并找出排名前三的选手。实现上述功能的部分Python程序如下,请在程序中划线处填入合适的代码。#导入相关库,读取数据,保存到DataFrame对象df中,代码略df.得分=df.sum(axis=1) #按行求和for i in df.index: df.at[i,"排名"]=① df1=② (3)根据上述df中的得分数据,统计男子和女子的平均得分,绘制如图b所示的柱形图,实现该功能的部分Python程序如下,请在程序中划线处填入合适的代码。df_g=df.groupby("组别",as_index=False).mean()plt.bar( ,df_g.得分) #设置绘图参数,代码略4.某商场的停车场有A、B、C、D、E五个停车区域,每个区域有100个停车位。商场整理出了某天所有停车位的停车情况,其中状态为“1”表示该停车位停入一辆车,“-1”表示离开一辆车,现要对停车场各区域的停车数据进行分析。请回答下列问题:(1)商场某天的停车数据保存在DataFrame对象中,如图a所示。若要编写Python程序统计“区域A”全天的总停车车次,下列方法中,正确的是 (单选,填字母)。 A.从df中筛选出区域为“A”的数据dfq,再统计dfq中“状态”列的总和;B.对df数据按“状态”降序排序并保存到dfz中,并统计dfz中状态为“1”的数据行数;C.先在df中筛选出区域为“A”的数据dfq,再从dfq中筛选出状态为“1”的数据dfz,统计dfz的数据行数;(2)若该停车场前一天结束时场内停车数量为0,根据停车情况计算一天中总停车数量最多的时刻。实现上述功能的部分Python程序如下,请在程序中划线处填入合适的代码。import pandas as pdimport matplotlib.pyplot as plt# 读取如图a所示数据,保存到DataFrame对象df中,代码略df["时间"]=df["时"]*60+df["分"]dfs=df.sort_values("时间",ascending=True) #以时间为关键字排序dfg=dfs.groupby("时间",as_index=False).sum()#以时间分组,并求和t=s=0k=dfg.index[0]for i in dfg.index: t=① if t>s: s=t ② time=dfg.at[k,"时间"]print("停车数量最多的时刻为:",time//60,"时",time%60,"分")(3)根据上述求出的停车数量最多的时刻,统计该时刻各区域的停车数量,绘制如图b所示的柱形图,实现该功能的部分Python程序如下,请在划线处填入合适代码。time=dfg.at[k,"时间"]dfs=dfs[dfs["时间"]<=time]dfq=dfs.groupby("区域",as_index=False).sum()#以区域为分组,并求和plt.bar(dfq["区域"], ) #绘制柱形图 5.“运动有奖”系统各智能终端上传相关数据至服务器端,积分规则如下:一天步数超过10000步,运动达标,可获得积分1分,若出现连续运动达标,则获得积分比前一天多1分,若中断,则重新开始计分。如某用户在第1,3,4,5,7天运动达标,则获得的积分为1+1+2+3+1=8分。现统计4月份各用户的运动积分情况,编写Python程序如下:def Cal (userid,df): tmp=tmp.sort_values('日期',ascending=True) tmp=tmp.reset_index() #重置tmp的索引,使其从0开始连续编号 score=0;k=1;i=0 while i score+=1;j=i+1 while j k+=1 score=① j+=1 ② i=j return scoreimport matplotlib.pyplot as pltimport pandas as pd#读取4月相关数据,处理成DataFrame对象df1,部分数据如图a所示,代码略n=7;id=['']*n;sc=[0]*nfor i in range(n): id[i]='用户'+str(i+1) sc[i]=Cal (i+1,df1)plt.bar(③ ,sc) #绘制柱形图 #设置绘图参数,显示如图b所示柱形图,代码略请回答下列问题:(1)程序中方框处应填入的正确代码为 (多选,填字母)。 A.tmp=df[df['用户编号']==userid]tmp=tmp[tmp['步数']>10000]B.tmp=df[df.步数>10000]tmp=tmp[tmp.用户编号==userid]C.tmp=df[df['用户编号']==userid]tmp=df[df['步数']>10000]D.tmp=df.sort_values('用户编号')tmp=tmp.sort_values('步数')(2)请在程序划线①、②、③处填入合适的代码。1.一球迷收集了近3个赛季的CBA比赛数据,每个赛季的数据分别保存在独立文件中,如图a所示,文件中数据记录格式如图b所示,以球员“布莱克尼”的“二分”数据“7.9-16.3”为例,7.9表示二分球平均命中数量,16.3表示二分球平均投篮次数。该球迷想根据历史赛季数据预测各球队下个赛季的首发阵容,编写了如下Python程序,请回答下列问题:(1)定义readData函数,功能为:读取某赛季的excel文件,返回每个队员的得分(得分=二分球命中数量*2+三分球命中数量*3+罚球命中数量。函数代码如下,划线处应填入的代码为 (单选,填字母)。 A.df["得分"][i]+=n*cols[col]B.df["得分"][i]=n*cols[co1]C.df["得分"]+=n*cols[col]D.df["得分"]=df.二分*2+df.三分*3+df.罚球import pandas as pddef readData(file): df=pd.read_excel(file) #读取文件file中的数据 cols={"二分":2,"三分":3,"罚球":1} for i in range(len(df)): #计算每个队员的得分 for col in cols: p=df[col][i].find("-") #在字符串中找到“-”的位置 n=float(df[col][i][:p]) return df(2)定义select函数,功能为:筛选各球队得分最高的5名球员作为首发阵容,并把球员名字及得分存入列表members后返回。其中n号球队各球员名字存入members[2*n]中,得分存入members[2*n+1]中,请在划线处填写合适的代码。def select(teams): #teams是字典变量,如:{"浙江":0,"上海":1},字典的值代表球队编号 seasons=["20-21","21-22","22-23"] members=[0]*len(teams)*2 df=readData(seasons[0]+".x1sx") for season in ① : file=season+".xlsx" df1=readData(file) df=pd.concat([df,df1])#合并两个DataFrame对象数据 for team in teams: df1=② df1=df1.groupby("球员",as_index=False).mean() #计算各球员平均得分 df1=df1.sort_values("得分",ascending=False).head(5) #按得分降序排序并选取前5名 ③ members[2*n]=df1["球员"].values members[2*n+1]=df1["得分"].values return members(3)定义showChart函数,功能为:查询某球队的首发阵容,绘制柱形图,图表如题图c所示,程序如下,请在划线处填写合适的代码。import matplotlib.pyplot as pltdef showChart(team,members): n=teams[team] plt.bar( , ) plt.title(team+"队首发阵容") plt.show()主程序代码如下。teams={"浙江":0,"上海":1,"山东":2,"广东":3,"北京":4}members=select (teams)while True: team=input("输入球队:") if team=="": break showChart(team,members)2.李老师收集了2022级学生“七选三”选课意愿数据,每个班的数据分别保存以'xk'+班级为命名的xlsx文件中,如图a所示,每个文件记录了该班每位学生的选考科目选课情况,如图b所示。为统计分析全年级“七选三”选课意愿数据,编写Python程序,请回答下列问题:(1)读取各班xlsx文件,并合并到一个DataFrame对象。程序代码如下,请在划线处填入合适的代码。def data(i): i=i+1 if ① : t='0'+str(i) else: t=str(i) df_t=pd.read_excel('xk'+t+'.xlsx') return df_tn=12df=pd.DataFrame()for i in range(n): df=df.append(② ,ignore_index=True) #在df末尾追加一个DataFrame (2)统计“技术”选课人数占总人数的比例,并作出各个科目选课人数的柱形图。km={'物理':0,'化学':0,'生物':0,'政治':0,'历史':0,'地理':0,'技术':0}for i in range(len(df)): xk=df['选课'][i].split(',') #将'选课'字符串以逗号分隔出来 for j in xk: ① print('选考技术占比: '+str(round(② *100,2))+'%') df_km=pd.DataFrame({'科目':km.keys(),'人数':km.values()}) #转换为DataFrameplt.title('选考各科目人数对比图')plt.bar(③ ,df_km['人数'],label='各科目人数') plt.legend()plt.show()(3)分析图c可知,选课人数最多的三门科目是 。 3.某同学收集了部分城市2022年4月每天24小时空气质量数据,按日分别保存在CSV文件中,部分文件如图a所示。数据格式如图b所示。请回答下列问题:(1)定义函数avg,功能是读取某天的数据文件,计算该天空气质量指数(AQI)的平均值并返回,代码如下。请在划线①处应填入合适的代码。def avg(filename): df=pd.read_csv(filename) df1=df[df.columns[2:]] #取类型及其后的所有列 g=df1.groupby(① ,as_index=False).mean() return ② 划线②处应填入的代码为 (单选,填字母)。 A.df[df.类型=='AQI']B.df1.AQIC.g.AQID.g[g.类型=='AQI'](2)统计本月各城市空气质量最长连续优、良的天数(按照环境空气质量标准,空气污染指数AQI≤50为优级,AQI≤100为良好),代码如下,绘制的图表如图c所示。请在划线处填入合适的代码。import pandas as pdimport matplot1ib.pyplot as pltn=10 #城市个数count=[0]*ndaymax=[0]*nfor i in range(1,31): day=str(i) if len(day) <2: day='0'+str(i) daydata=' 202204'+day+' . csv' dayaqi=avg(daydata) city=dayaqi.columns[1:n+1] for j in range (n): t=city[j] if dayaqi.at[0,t]<=100: ① else: if count[j]>daymax[j]: daymax [j]=count[j] count[j]=0 for k in range (n): if count [k]>daymax[k]: ② print (daymax)plt.bar(③ ,daymax) p1t.show()4.小明是智能门禁系统的管理员,他导出某天学生晚自习后回寝室的刷卡数据到文件sj.xlsx中,部分数据如图a所示。学生编号由4位年级号+2位班级号+2位学号组成(每班学号依次从1号开始按顺序编号,若某班有50人,则该班学生学号依次从1-50号编号);刷卡时间为计算方便,已转为分钟;进出门状态的值为0表示出门,1表示进门。小明编写Python程序,统计并输出当晚每班未刷卡进门的学生学号。(1)主程序如下,请在划线处填入合适的代码。import pandas as pdimport matplotlib.pyplot as pltdf=pd.read_excel("sj.xlsx")df=df.sort_values( ,ascending=True) #df 按学生编号升序排序 '''字典 clas中存入每班总人数,如 clas={"高一 1 班":53,"高一 2 班":49,...}表示高一 1 班人数为53人,高一 2 班人数为49人,代码略'''for i in clas: d=df[df['班级']==i] #从df中筛选出班级为i的数据存到d #将d的行索引重置,依次从0开始编,代码略 wd=pclass(d,clas[i]) #若班级 i 未刷卡进门的学生学号为3,7,则wd=[3,7] #输出班级 i 未刷卡进门的学生学号,代码略(2)定义函数pclass(d,num),功能是返回某班级未刷卡进门的学生学号。若学生未刷卡,则认为该学生未刷卡进门;若学生多次刷卡,以学生当晚最后刷卡的状态作为是否刷卡进门的依据,请在划线处填入合适的代码。def pclass(d,num): c=[0]*(num+1) #列表c中有num+1个元素,均为0 li=[];i=0 while i bh=d.at[i,"学生编号"] #读取行索引 i、列标签"学生编号"的值赋值给 bh tm=d.at[i,"刷卡时间"];t=d.at[i,"进出门状态"] j=i+1 while j if d.at[j,"学生编号"]!=bh: ① else: if ② : t=d.at[j,"进出门状态"] tm=d.at[j,"刷卡时间"] j=j+1 i=j bh=str(bh) c[ ③ ]=t for i in range(1,num+1): if c[i]==0: li.append(i) return li(3)根据df中的数据,统计寝室各门的人流量,绘制如图b所示的柱形图,实现该功能的部分Python程序如下:df1=df.groupby("刷卡门号",as_index=False).count()#设置绘图参数,代码略plt.bar(x,y,label="经过该门的人数")程序的方框中应填入的正确代码为 (单选,填字母)。 A.x=df['刷卡门号']y=df['学生编号']B.x=df1['刷卡门号']y=df1['学生编号']C.x=df['刷卡门号']y=range(0,100,20)D.x=df1['刷卡门号']y=range(0,100,20)5.某校高三首考后,汇总了学生7选3成绩以及次考科目弃考情况(注意:1表示次考弃考,0表示参加次考),ckqk.xlsx文件部分数据如图a所示,现要统计各班人均弃科目考门数和各科次考弃考比例,编写如下Python程序。请回答下列问题:(1)下列代码读取ckqk.xlsx文件,输出各班每人平均弃考门数,输出格式如图b所示,则划线处应填写的代码为 (单选,填字母)。 A.groupby('班级').弃考门数.mean()B.groupby('班级',as_index=False)['弃考门数'].mean()import pandas as pddf=pd.read_excel('ckqk.xlsx')df['弃考门数']=df[['弃考科目1','弃考科目2','弃考科目3']].sum(axis=1)dfg=df. print(dfg)(2)统计7选3每门科目选考人数和弃考人数,并计算各科目弃考比例,Python程序如下,请在划线处填写合适的代码。courses={}for i in df.index: for k in range(1,4): subject=df.at[i,'科目%d'%k] if ① : courses[subject]=[1,0] #[1,0]表示当前为本科目第1个人,弃考人数初值置0 else: courses[subject][0]+=1 abandon=df.at[i,'弃考科目%d'%k] if abandon==1: ② dfs=pd.DataFrame(courses)dfs=dfs.Tdfs=dfs.rename(columns={0:'总人数',1:'弃考人数'})dfs['弃考比例']=round(dfs['弃考人数']/dfs['总人数']*100,1)dfs=dfs.sort_values('弃考比例',ascending=False)(3)编写代码绘制如图c所示图表,则7先3科目中次考弃考比例超30%的有① 门。为实现该功能,请在下面划线处填入合适代码。 import matplotlib.pyplot as pltplt.bar(dfs.index,② ,label='弃考比例') #设备绘图参数,代码略6.第19届杭州亚运会已完美落幕,亚运会赛事以“杭州为主,全省共享”的原则分布在杭州、宁波、温州、湖州、绍兴、金华各地。大会共有40个大项,61个分项,最终诞生了481块金牌。小李作为一名体育爱好者想重温大会赛程安排,他从杭州亚运会的官网上采集了相关数据,整理后存储在“杭州第19届亚运会总赛程.xlsx”文件中。如图a所示(0表示有赛事但不产生金牌,其他数字表示当天产生的金牌数)。为了更清楚地了解相关赛事信息,小李编写了Python程序,请回答以下问题。(1)足球是小李最关注的大项,为了解足球的赛程安排,划线处应填入的代码为 (单选,填字母)。 A.df.大项=="足球"B.df["大项"=="足球"]C.df[df.大项=="足球"]D.df[df["大项"]==足球]import pandas as pddf=pd.read_excel("杭州第19 届亚运会总赛程.xlsx")df2= print(df2)(2)足球项目的比赛分布在杭州等城市的八个场馆,了解各个场馆举办足球赛事的具体场次,找到连续举办足球赛事最多的场馆,如图b所示。程序代码如下,请在划线处填入合适的代码。黄龙体育中心体育场[9/19,9/21,9/24,9/27,9/28,10/1,10/4,10/6,10/7] 临平体育中心体育场[9/19,9/21,9/22,9/24,9/25,9/28,9/30,10/3] 上城体育中心体育场[9/20,9/22,9/24,9/25,9/27,9/28,10/1,10/3,10/7] 萧山体育中心体育场[9/19,9/20,9/21,9/22,9/24,9/25,9/27,9/28,10/1,10/4] 金华体育中心体育场[9/19,9/21,9/24,9/27] 浙江师范大学东体育场[9/19,9/21,9/24,9/27] 温州奥体中心体育场[9/21,9/22,9/24,9/25,9/27,9/28,9/30] 温州体育中心体育场[9/22,9/24,9/25,9/27,9/28,9/30] 连续举办足球赛事最多的场馆:萧山体育中心体育馆图bdic={}max=0;maxsta=""lst=df2.竞赛场馆.tolist()#将数据转换为列表for i in lst: dic[i]=[]for i in df2.index: c=0 sta=df2["竞赛场馆"][i] for j in df2.columns[2:-3]: if df2.at[i,j]==0 or df2.at[i,j]==1: ① c=c+1 if c>max: max=c;maxsta=sta else: ② for i in dic: print(i,dic[i])print("连续举办足球赛事最多的场馆:",③ ) (3)足球在亚运会期间总共产生两枚金牌,统计分析其他大项产生的金牌总数,找出产生金牌总数最多的十个大项,并绘制图形如图c所示。程序代码如下,请在划线处填入合适的代码。import matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['simhei']#图表中文标签显示为黑体grp=df.groupby(① ,as_index=False).金牌总数.sum() grp=grp.sort_values("金牌总数",ascending=False). ② x=grp.大项y=grp.金牌总数#设置图表参数,代码略。8.1 利用pandas进行数据统计学习目标 1.对DataFrame对象按列进行公式计算,描述DataFrame对象数据以字典中键为列的存储形式。2.对每个键对应一列数据多个值进行切片,掌握取出不同数据区域内容的方法。3.运用函数统计对象的平均值等操作,运用排序函数对数据进行有序排列。4.运用groupby函数对数据进行分组的方法,并在分组的基础上进行数据统计。 (2023年1月浙江省选考)小红收集了部分城市2021年全年每天PM2.5、PM10、CO浓度数据,每天的数据分别保存在以8位日期字符串命名的CSV文件中,部分文件如图a所示,每个文件记录了一天24小时的监测数据,示例如图b所示。为统计分析城市A全年各月份PM2.5的月平均浓度(当月的日平均浓度的平均值),编写Python程序。请回答下列问题:(1)定义pmday函数,功能为:读取某天的CSV文件,返回城市A当天PM2.5的日平均浓度。函数代码如下,划线处应填入的代码为 (单选,填字母)。 A.df['类型']=='PM2.5'B.df['类型'=='PM2.5']C.df[df['类型']]=='PM2.5'D.df[df['类型']=='PM2.5']import pandas as pddef pmday(dayfile): df=pd.read_csv(dayfile) #读取文件dayfile中的数据 df= return df['城市A'].mean() #返回城市A当天PM2.5的日平均浓度(2)统计城市A各月份PM2.5的月平均浓度并绘制线形图,部分Python程序如下,请在划线处填写合适的代码。import matplotlib.pyplot as plt def tstr(t): if t<10: retrun '0'+str(t) else: retrun str(t)pm=[0]*12mdays=[31,28,31,30,31,30,31,31,30,31,30,31]#2021年每月天数for m in range(12): sm=0;mstr=tstr(m+1) for d in range(① ): dstr=tstr(d+1) dayfile='2021'+mstr+dstr+'.csv' sd=pmday(dayfile) ② pm[m]=sm/mdays[m]x=[1,2,3,4,5,6,7,8,9,10,11,12]y=③ plt.plot(x,y)#绘制线性图#设置绘图参数,显示如图c所示线形图,代码略(3)城市A 2021年PM2.5年平均浓度为34.6微克/立方米。由图c可知,城市A 2021年PM2.5月平均浓度超过年平均浓度的月份共 个。 答案 (1)D (2)①mdays[m] ②sm+=sd③pm (3)5解析 本题考查利用pandas模块进行数据处理。(1)可以通过布尔型数据选取满足条件的行。(2)计算各月份PM2.5浓度的平均值,可以累加各月的每天PM2.5浓度的平均值。变量dayfile表示每天的数据文件名,题干已经提示“每天的数据分别保存在以8位日期字符串命名的CSV文件”,调用函数pmday(dayfile),可以得到当天PM2.5的日平均浓度,并保存于变量sd。当月的各天PM2.5的日平均浓度需要累加起来,最后求均值。③空横坐标为月份,纵坐标为PM2.5月平均浓度,即列表pm的数据。(3)超过年平均浓度的月份为1、2、3、4、11月。 pandas有Series和DataFrame两种对象,这两种对象均有index和values属性,Series对象的values是一维的,DataFrame的values是二维的,因此DataFrame对象比Series对象多一个columns属性,可以理解为index表示行号,columns表示列名。pandas处理的对象主要是DataFrame,取出DataFrame中的一列,降维为Series对象,可以用list函数转换为列表,对某列的值进行切片,可以转换为一个数值。可以对记录选取、筛选和分组操作,灵活地区分不同类型的数据,可以对记录进行排序操作,实现数据的有序显示。可以对各条记录的字段进行遍历,统计符合要求字段值的数量、总和、平均值以及最值。例1 某学院举行运动会,比赛设跳高、100米等项目,每个项目分男子组和女子组。现要进行报名数据处理和比赛成绩分析。请回答下列问题:(1)运动会报名规则为:对于每个项目的男子组和女子组,每个专业最多各报5人(如“软件工程”专业在男子跳高项目中最多报5人)。软件工程专业的报名数据保存在DataFrame对象df中,如图a所示。若要编写Python程序检查该专业男子跳高项目报名是否符合规则,下列方法中,正确的是 (单选,填字母)。 A.从df中筛选出性别为“男”的数据dfs,再从dfs中筛选出项目为“跳高”的数据,判断筛选出的数据行是否超过5行B.对df中数据按性别排序并保存到dfs中,再从dfs中筛选出项目为“跳高”的数据,判断筛选出的数据行是否超过5行C.从df中筛选出项目为“跳高”的数据dfs,判断dfs中是否有连续5行以上的男生数据(2)运动员比赛成绩的部分数据如图b所示。根据已有名次计算得分,第1名至8名分别计9,7,6,5,4,3,2,1分,第8名之后计0分。实现上述功能的部分Python程序如下,请在程序中划线处填入合适的代码。import pandas as pdimport matplotlib.pyplot as plt#读取如图b所示数据,保存到DataFrame对象df1中,代码略f=[9,7,6,5,4,3,2,1]for i in range(0,len(df1)): rank=df1.at[i,"名次"] #通过行、列标签取单个值 score=0 if rank<=8: df1.at[i,"得分"]=score(3)根据上述 df1中的得分数据,统计各专业总分,绘制如图c所示的柱形图,实现该功能的部分Python程序如下:df2=df1.groupby(" ",as_index=False).sum() #分组求和 #设置绘图参数,代码略plt.bar(x,y)①请在程序中划线处填入合适的代码。②程序的方框中应填入的正确代码为 (单选,填字母) A.x=df1["专业"]y=df1["总分"]B.x=df2["专业"]y=df2["得分"]C.df1["专业"]="专业"df1["总分"]="总分"D.df2["专业"]="专业"df2["得分"]="得分"思维点拨明考向 本题考查利用pandas模块进行数据处理精点拨 (1)A选项分二次筛选后,得到该专业男生参加跳高的人数,并检查数据。(2)名次为1-8的可以在列表f中取出对应的得分,但列表的索引下标是从0开始的。(3)①从图表中可以看出是按"专业"进行分组;②图表横轴为专业名称,纵轴为各专业的得分情况答案 (1)A (2)score=f[rank-1]或score=f[int(rank)-1] (3)①专业 ②B变式1 小明通过调查问卷收集了某餐厅近期上新菜品的顾客满意度情况数据,一周的调查结果分别存储在“day1.csv”、“day2.csv”等文件中(如图a所示),每个文件部分界面如图b所示。为统计分析新菜品点菜人数及各满意程度,编写Python程序,回答下列问题:点菜数 满意数 一般数 不满意数蕉蕉咸蛋黄焗虾 87 76 9 2顺德沙姜走地鸡 105 92 8 5生啫蒜蓉粉丝虾 60 35 18 7葱烧酱啫牛肉粒 68 47 20 1图c(1)定义fun函数,实现统计某天某个新菜品的点菜数及满意、一般、不满意的数量,请在划线处填入合适的代码。import pandas as pddef fun(file,menu): #参数menu列表存储各种菜品名称。字典ans是以菜品为键,对应的值是一个列表,有点菜数及满意、一般、不满意共4个值。 x=["满意","一般","不满意"] df=pd.read_csv(open(file)) #读取csv文件中的数据 ans[menu][0]+=df[menu].① for i in df.index: for j in range(len(x)): if df.at[i,menu]==x[j]: ② break(2)统计一周每个新菜品的点菜数,满意、一般和不满意数,程序运行结果如图c所示。实现上述功能Python程序如下,请在程序中划线处填入合适的代码。ans={"蕉蕉咸蛋黄焗虾":[0,0,0,0],"顺德沙姜走地鸡":[0,0,0,0],"生啫蒜蓉粉丝虾":[0,0,0,0],"葱烧酱啫牛肉粒":[0,0,0,0]} #ans中存放每个菜品对应的点菜数、满意数、一般数和不满意数for i in : filename="day"+str(i)+".csv" for menu in ans: fun(filename,menu)df1=pd.DataFrame(ans,index=["点菜数","满意数","一般数","不满意数"]) #利用字典ans创建df1对象。df1=df1.T #将df1对象进行行列转置print(df1)(3)计算每道菜品“满意率”,按照“满意率”升序排序后绘制柱形图,如图d所示:import matplotlib.pyplot as pltdf1["满意率"]=df1.满意数/df1.点菜数*100df2=df1.sort_values(" ") plt.title("餐厅新菜品满意率情况")plt.bar( ,label="满意率(%)")plt.legend();plt.show()①请在程序划线处填入合适的代码。②程序的方框中应填入的正确代码为 (单选,填字母)。 A.df1.index,df1.满意率B.df2.index,df2["满意数"]C.df2.index,df2.满意率答案 (1)①count() ②ans[menu][j+1]+=1 (2)range(1,8)或range(1,8,1)或range(7,0,-1)(3)①满意率 ②C解析 本题考查利用pandas统计数据。(1)①统计非空字段记录的数量。②遍历每天各条统计记录,df.at[i,menu]表示第i行菜品menu的投票结果,用内循环来匹配这个结果,将统计结果写入ans数组该菜品menu元素的第j+1(ans[menu][0]记录了当天该菜品总的投票数)个项中。(2)采用循环统计一周共7天的统计结果,需要循环7次。(3)①按照“满意率”升序排序。②从题图c可以得到df1对象的index属于是各个菜品名称,图表横轴是排序后df2的index属性,纵轴是排序后的满意率。 例2 学校食堂以服务质量进行了调查问卷,调查项目共5项(具体内容略)。12个班级的调查结果分别存储在“dy01.csv”“dy02.csv”等文件中(如图a所示),每个文件部分界面如图b所示。现需要分析每个问题选“A”的情况,采用Python编制程序代码,请回答下列问题。(1)定义fun_A函数实现统计某个班级5个问题的选“A”的人数,请在划线处填入合适代码。import pandas as pddef fun_A(file): df=pd.read_csv(file) A_list=[] for col in df.columns[1:]: A_list.append(c) return A_list(2)统计12个班级每个问题选“A”的总人数,请在划线处填入合适代码。ans_list=[]s="010203040506070809101112"for i in range(0,len(s)-1,2): filename="dy"+ ① +".csv" res=fun_A(filename) ans_list.append(res)x=["问题1","问题2","问题3","问题4","问题5"]y=[0,0,0,0,0]for i in range(5): s=0 for j in range(12): ② y[i]=s(3)根据上述统计的得分数据,统计每个问题选“A”的数量,绘制如图c所示的柱形图,请在划线处填入合适代码。import matplotlib.pyplot as pltplt.title("每个问题选A的总人数")plt.bar(① ,② ) #显示图表,代码略思维点拨明考向 本题考查利用pandas模块进行数据处理精点拨 (1)df.columns[1:]依次对应5个问题的名称,对每个问题进行筛选,找出选A的记录并统计数据,赋值给c,再将c添加到列表A_list中。(2)①12个班级的班名存储在字符串s中,每个班名占两个数字,变量i表示每个班名的起始索引。②ans_list是一个二维数组,共12个元素,分别存储每个班5个问题的选A的人数,现要统计每个问题选A的总和,因此变量i是ans_list数组的列索引,变量j是ans_list数组的行索引。(3)图表的横轴为问题的名称x,纵轴为各个问题选A的总人数y答案 (1)c=len(df[df[col]=="A"])(2)①s[i:i+2] ②s+=ans_list[j][i](3)①x ②y变式2 为统计分析不同年级学生名字中的常用字,小王同学收集了本校所有学生的名字,并以入学年份为文件名分别保存在Excel文件中,文件如图a所示,每个文件包含了学生的年级、姓名和性别信息,如图b所示。编写Python程序。请回答下列问题:(1)定义getname函数,功能为:读取某年级的Excel文件,找出文件中同性别的学生,将学生姓名中的每个字(不包含姓氏,没有复姓学生)提取出来存储在列表mz中并返回列表。函数代码如下,请在划线处填写合适的代码。def getname(nj,xb): mz=[] df=pd.read_excel(nj+"学生名单.xlsx") for i in df.index: xm=df.at[i,"姓名"] if ① : for m in xm[1:]: mz.append(m) return ② (2)小王想统计女生名字中出现最频繁的10个字,部分Python程序如下,请在划线处选择合适的代码。import pandas as pdxb=input("请输入性别:") #输入性别"女"nianji=["2020级","2021级","2022级"]mzs=[] #存储姓名中的字for nj in nianji: mzs=mzs+getname(nj,xb)data={'字':mzs,'个数':[1]*len(mzs)}df1=pd.DataFrame(data)df2=df1.groupby("字",as_index=False).count() #统计每个字出现的次数df3= 划线处应选择的代码是 (单选,填字母)。 A.df2.sort_values("个数",ascending=True)[:10]B.df2.sort_values("字",ascending=False).tail(10)C.df2.sort_values("字",ascending=True).tail(10)D.df2.sort_values("个数",ascending=False).head(10)(3)将统计结果(10个最频繁的字)绘制成柱形图,部分Python程序如下,请在划线处填写合适的代码。import matplotlib.pyplot as pltplt.title(xb+"生取名常用字")plt.bar(df3.字, ) plt.show()答案 (1)①df.at[i,"性别"]==xb 或 df["性别"][i]==xb 或 df性别[i]==xb ②mz (2)D(3)df3.个数或 df3["个数"]解析 本题考查利用pandas模块进行数据处理。(1)①遍历学生名单每一行,取出当前行学生姓名,找出当前行中性别df.at[i,"性别"]等于性别xb的学生记录。②将符合条件学生名字中每个文字存储到列表mz,并返回列表。(2)利用字典data创建一个df1对象,该对象有“字”和“个数”两列,“字”列是提取的每个姓名中的字符,对应的数量均为1,按“字”分组并统计出现的次数,因此需按"个数"进行降序排列,并取出最大(最前面)的10条记录。(3)图表中横轴为出现的最常见的10个字,纵轴为每个字对应出现的次数。1.管理员从停车系统中导出了3月份每天的停车记录,如图a所示,每天的停车记录内容格式如图b所示(进出标记为0表示驶入,1表示驶出,停车记录已按进出时间升序排列)。为统计停车场3月份每天的收入(只有驶入或驶出记录的车辆不参与计费),编写Python程序。(1)定义readdata函数,功能为:读取某一车牌车辆当天的进出时间记录,返回该车辆当天的停车总费用。参数data为该车牌当天的进出时间记录。函数代码如下,请回答下列问题:①程序段中加框处应填入的代码为 (单选,填字母)。 A.data.进出标记[p]==0B.data.进出标记[p-1]==0 and data.进出标记[p]==1C.data.进出标记[p+1]==1D.data.进出标记[p]==0 and data.进出标记[p+1]==1②请在程序段划线处填入合适的代码。def catime(t1,t2): #计算时间t1与时间t2之间的时间差并计算本次停车的费用,函数返回停车费用,代码略。def readdata(data): m=len(data) p=0;cost=0;total=0 while p if ① : cost=catime(data.进出时间[p],data.进出时间[p+1]) total+=cost p+=1 ② return total(2)统计停车场3月份每天的收入并绘制柱形图,部分Python代码如下,请在划线处填入合适的代码。n=31;dic={}for i in range(1,n+1): ① fname="3月"+str(i)+"日.xlsx" df=pd.read_excel(fname) df_g=df.groupby("车牌").进出标记.count() for k in df_g.index: #只有一条驶入或驶出记录的车辆不参与计费 if ② : data=df[df.车牌==k] dic[i]+=readdata(data)#绘制3月份整体收入图表并显示,代码略。(3)已知每月分为3个时间段,1-10日称为上旬,11-20日称为中旬,21-30(31)日称为下旬。则由图c可知,该停车场3月份 (选填:上旬/中旬/下旬)收入总和最高。 答案 (1)①D ②p+=1或p=p+1(2)①dic[i]=0 ②df_g[k]!=1 (3)下旬解析 (1)①遍历数据data,进出标记为0表示驶入,1表示驶出,先有驶入,再有驶出。②处理下一条记录。(2)①语句dic[i]+=readdata(data)将计算每天的费用,因此需对dic[i]赋值为0。②df_g是按车牌进行分组记录数量,只有一条驶入或驶出记录的车辆不参与计费,即df_g[k]的值大于1。(3)略。2.小明为了研究某地近十年每月的温差变化,编写Python程序。以2023年4月为例,该月每天的温度数据分别保存在以8位日期字符串命名的excel文件中,部分文件如图a所示,每个文件记录了一天24小时的温度数据,如图b记录了4月28日的数据。(1)定义dv函数,功能为:读取某天的excel文件,返回当天最高温度与最低温度的差值。函数代码如下,划线处应填入的代码为 (单选,填字母)。 A.df["温度"].head(1)-df["温度"].tail(1)B.df["温度"].(max()-min())C.df["温度"].max()-df["温度"].min()D.df["温度"].(head(1)-tail(1))def dv(dayfile): df=pd.read_excel(dayfile) diff= return diff(2)定义find函数,功能为:用字典创建DataFrame对象,并筛选出4月份温差大于13的日期,输出结果如图c所示,请在划线处填入代码。日期 温差3 0404 13.19 0410 13.115 0416 13.317 0418 13.827 0428 15.5图cdef find(r,t): dic={"日期":r,"温差":t} df1=pd.DataFrame(dic) df2= return df2(3)绘制4月份每天的温差柱形图如图d,部分Python程序如下,请在划线处填写合适的代码。def tstr(t): if t<10: return '0'+str(t) else: return str(t)td=[];date=[]for i in range(30): dstr=tstr(① ) dayfile='202304'+dstr+'.xlsx' date.append(dayfile[4:8]) td.append(② ) #设置绘图参数,代码略plt.bar(date,③ ) plt.show()答案 (1)C (2)df1[df1.温差>13]或df1[df1["温差"]>13] (3)①i+1 ②dv(dayfile) ③td解析 (1)df["温度"].max()表示当天最高温度,df["温度"].min()为最低温度。(2)对温差进行筛选。(3)①变量i的值为0至29,而日期为1号至30号。②调用dv函数求每天的温差。③y轴为温差td。3.某社区开展“我运动,我健康”趣味保龄球活动,比赛规则为:每人投掷3个球,击打15米外的10个瓶子,按照三次击倒总个数累计得分,击倒1个瓶子计1分。姓名 组别 第1次 投掷个数 第2次 投掷个数 第3次 投掷个数 得 分 排 名孙*正 男子 8 6 8魏*恬 女子 6 6 9陈*远 男子 5 7 8邢*儿 女子 8 5 7陈*妤 女子 8 3 6姚*元 男子 2 8 7史*妮 女子 5 3 6吕*家 男子 2 8 6袁*泉 男子 3 7 5图a(1)定义cal函数,score为得分,返回该得分在list数组中的排名。例如score=3,list=[1,3,3,4,4],则返回得分3的排名为3。请在程序中划线处填入合适的代码。def cal(score,list): rank=1 for i in list: if : rank+=1 return rank(2)参加活动的部分数据如图a所示,根据得分计算排名,并找出排名前三的选手。实现上述功能的部分Python程序如下,请在程序中划线处填入合适的代码。#导入相关库,读取数据,保存到DataFrame对象df中,代码略df.得分=df.sum(axis=1) #按行求和for i in df.index: df.at[i,"排名"]=① df1=② (3)根据上述df中的得分数据,统计男子和女子的平均得分,绘制如图b所示的柱形图,实现该功能的部分Python程序如下,请在程序中划线处填入合适的代码。df_g=df.groupby("组别",as_index=False).mean()plt.bar( ,df_g.得分) #设置绘图参数,代码略答案 (1)i>score (2)①cal(df.at[i,"得分"],df.得分) ②df[df.排名<=3] (3)df_g.组别解析 本题考查利用pandas模块进行数据处理。(1)rank的初值为1,遍历各个数据,找出比他大的数的个数,并累加到rank,得到该数的排名。(2)①根据得分计算排名,并找出排名前三的选手。使用cal函数逐一计算排名并存储"得分"列中。②筛选排名小于等于3的记录。(3)x轴的数据为分组统计后的组别。4.某商场的停车场有A、B、C、D、E五个停车区域,每个区域有100个停车位。商场整理出了某天所有停车位的停车情况,其中状态为“1”表示该停车位停入一辆车,“-1”表示离开一辆车,现要对停车场各区域的停车数据进行分析。请回答下列问题:(1)商场某天的停车数据保存在DataFrame对象中,如图a所示。若要编写Python程序统计“区域A”全天的总停车车次,下列方法中,正确的是 (单选,填字母)。 A.从df中筛选出区域为“A”的数据dfq,再统计dfq中“状态”列的总和;B.对df数据按“状态”降序排序并保存到dfz中,并统计dfz中状态为“1”的数据行数;C.先在df中筛选出区域为“A”的数据dfq,再从dfq中筛选出状态为“1”的数据dfz,统计dfz的数据行数;(2)若该停车场前一天结束时场内停车数量为0,根据停车情况计算一天中总停车数量最多的时刻。实现上述功能的部分Python程序如下,请在程序中划线处填入合适的代码。import pandas as pdimport matplotlib.pyplot as plt# 读取如图a所示数据,保存到DataFrame对象df中,代码略df["时间"]=df["时"]*60+df["分"]dfs=df.sort_values("时间",ascending=True) #以时间为关键字排序dfg=dfs.groupby("时间",as_index=False).sum()#以时间分组,并求和t=s=0k=dfg.index[0]for i in dfg.index: t=① if t>s: s=t ② time=dfg.at[k,"时间"]print("停车数量最多的时刻为:",time//60,"时",time%60,"分")(3)根据上述求出的停车数量最多的时刻,统计该时刻各区域的停车数量,绘制如图b所示的柱形图,实现该功能的部分Python程序如下,请在划线处填入合适代码。time=dfg.at[k,"时间"]dfs=dfs[dfs["时间"]<=time]dfq=dfs.groupby("区域",as_index=False).sum()#以区域为分组,并求和plt.bar(dfq["区域"], ) #绘制柱形图 答案 (1)C (2)①t+dfg.at[i,"状态"] ②k=i (3)dfq["状态"]解析 (1)统计“区域A”全天的总停车车次,先筛选出区域A停车状态为1的记录。(2)①以时间分组、求和的结果放在dfg中,停车数量、离开停车场的车辆数量存放于dfg["状态"]列中,对这些数据进行累加求和,根据停车情况计算一天中总停车数量最多的时刻。②若找到比s更大的值时,则更新s和k。(3)图表x轴数据是区域,y轴数据是停车数量。5.“运动有奖”系统各智能终端上传相关数据至服务器端,积分规则如下:一天步数超过10000步,运动达标,可获得积分1分,若出现连续运动达标,则获得积分比前一天多1分,若中断,则重新开始计分。如某用户在第1,3,4,5,7天运动达标,则获得的积分为1+1+2+3+1=8分。现统计4月份各用户的运动积分情况,编写Python程序如下:def Cal (userid,df): tmp=tmp.sort_values('日期',ascending=True) tmp=tmp.reset_index() #重置tmp的索引,使其从0开始连续编号 score=0;k=1;i=0 while i score+=1;j=i+1 while j k+=1 score=① j+=1 ② i=j return scoreimport matplotlib.pyplot as pltimport pandas as pd#读取4月相关数据,处理成DataFrame对象df1,部分数据如图a所示,代码略n=7;id=['']*n;sc=[0]*nfor i in range(n): id[i]='用户'+str(i+1) sc[i]=Cal (i+1,df1)plt.bar(③ ,sc) #绘制柱形图 #设置绘图参数,显示如图b所示柱形图,代码略请回答下列问题:(1)程序中方框处应填入的正确代码为 (多选,填字母)。 A.tmp=df[df['用户编号']==userid]tmp=tmp[tmp['步数']>10000]B.tmp=df[df.步数>10000]tmp=tmp[tmp.用户编号==userid]C.tmp=df[df['用户编号']==userid]tmp=df[df['步数']>10000]D.tmp=df.sort_values('用户编号')tmp=tmp.sort_values('步数')(2)请在程序划线①、②、③处填入合适的代码。答案 (1)AB (2)①score+k ②k=1 ③id解析 (1)一天步数超过10000步,运动达标,若要查询某个用户编号达标的情况,可以先筛选出该用户的记录,再筛选出达标的情况。也可以先筛选出达标的记录,再在达标的记录中筛选出该用户的记录。(2)①若满足条件tmp.at[j-1,"日期"]+1==tmp.at[j,"日期"],则表示是连续的天数k,因此每天的得分需加k。②若不连续,k重新从1开始计数。③图表横坐标是用户id。1.一球迷收集了近3个赛季的CBA比赛数据,每个赛季的数据分别保存在独立文件中,如图a所示,文件中数据记录格式如图b所示,以球员“布莱克尼”的“二分”数据“7.9-16.3”为例,7.9表示二分球平均命中数量,16.3表示二分球平均投篮次数。该球迷想根据历史赛季数据预测各球队下个赛季的首发阵容,编写了如下Python程序,请回答下列问题:(1)定义readData函数,功能为:读取某赛季的excel文件,返回每个队员的得分(得分=二分球命中数量*2+三分球命中数量*3+罚球命中数量。函数代码如下,划线处应填入的代码为 (单选,填字母)。 A.df["得分"][i]+=n*cols[col]B.df["得分"][i]=n*cols[co1]C.df["得分"]+=n*cols[col]D.df["得分"]=df.二分*2+df.三分*3+df.罚球import pandas as pddef readData(file): df=pd.read_excel(file) #读取文件file中的数据 cols={"二分":2,"三分":3,"罚球":1} for i in range(len(df)): #计算每个队员的得分 for col in cols: p=df[col][i].find("-") #在字符串中找到“-”的位置 n=float(df[col][i][:p]) return df(2)定义select函数,功能为:筛选各球队得分最高的5名球员作为首发阵容,并把球员名字及得分存入列表members后返回。其中n号球队各球员名字存入members[2*n]中,得分存入members[2*n+1]中,请在划线处填写合适的代码。def select(teams): #teams是字典变量,如:{"浙江":0,"上海":1},字典的值代表球队编号 seasons=["20-21","21-22","22-23"] members=[0]*len(teams)*2 df=readData(seasons[0]+".x1sx") for season in ① : file=season+".xlsx" df1=readData(file) df=pd.concat([df,df1])#合并两个DataFrame对象数据 for team in teams: df1=② df1=df1.groupby("球员",as_index=False).mean() #计算各球员平均得分 df1=df1.sort_values("得分",ascending=False).head(5) #按得分降序排序并选取前5名 ③ members[2*n]=df1["球员"].values members[2*n+1]=df1["得分"].values return members(3)定义showChart函数,功能为:查询某球队的首发阵容,绘制柱形图,图表如题图c所示,程序如下,请在划线处填写合适的代码。import matplotlib.pyplot as pltdef showChart(team,members): n=teams[team] plt.bar( , ) plt.title(team+"队首发阵容") plt.show()主程序代码如下。teams={"浙江":0,"上海":1,"山东":2,"广东":3,"北京":4}members=select (teams)while True: team=input("输入球队:") if team=="": break showChart(team,members)答案 (1)A (2)①seasons[1:]②df[df.球队==team] ③n=teams[team](3)members[n*2] members[2*n+1]解析 本题考查pandas数据处理和可视化。(1)遍历每位队员的二分、三分和罚球的平均命中数量,根据公式求队员的3种投篮得分之和。col是字典中的键(二分、三分和罚球),cols[col]是投篮得分,df[col]表示二分等某列值数据,p是第i位球员命中数量和投篮次数分隔位置,因此n*cols[col]的乘积之和该球员总得分。(2)①seasons列表中存储了3场比赛的文件名,将这3个文件合并为一个文件。语句df=readData(seasons[0]+".x1sx")已经读取第1个文件,需对剩余的文件进行合并。②筛选各球队得分最高的5名球员作为首发阵容。teams是字典变量,键是球队名称,对每个球队进行遍历,筛选出该队全部队员,找出在3场比较得分和最高5名球员。③取出球队编号,将每个球队的球员姓名和得分存储到members对应的数组元素中。teams字典值为球队的编号,members中元素个数为len(teams)*2,n号球队各球员名字存入members[2*n]中,得分存入members[2*n+1]中。(3)略。2.李老师收集了2022级学生“七选三”选课意愿数据,每个班的数据分别保存以'xk'+班级为命名的xlsx文件中,如图a所示,每个文件记录了该班每位学生的选考科目选课情况,如图b所示。为统计分析全年级“七选三”选课意愿数据,编写Python程序,请回答下列问题:(1)读取各班xlsx文件,并合并到一个DataFrame对象。程序代码如下,请在划线处填入合适的代码。def data(i): i=i+1 if ① : t='0'+str(i) else: t=str(i) df_t=pd.read_excel('xk'+t+'.xlsx') return df_tn=12df=pd.DataFrame()for i in range(n): df=df.append(② ,ignore_index=True) #在df末尾追加一个DataFrame (2)统计“技术”选课人数占总人数的比例,并作出各个科目选课人数的柱形图。km={'物理':0,'化学':0,'生物':0,'政治':0,'历史':0,'地理':0,'技术':0}for i in range(len(df)): xk=df['选课'][i].split(',') #将'选课'字符串以逗号分隔出来 for j in xk: ① print('选考技术占比: '+str(round(② *100,2))+'%') df_km=pd.DataFrame({'科目':km.keys(),'人数':km.values()}) #转换为DataFrameplt.title('选考各科目人数对比图')plt.bar(③ ,df_km['人数'],label='各科目人数') plt.legend()plt.show()(3)分析图c可知,选课人数最多的三门科目是 。 答案 (1)①i<10 或者 i<=9 ②data (i)(2)①km[j]+=1 ②km['技术']/len(df)③df_km['科目'] (3)物理、化学、地理(不分顺序)解析 本题考查pandas与matplotlab模块相关知识。(1)①空在班号前补0,当i值介于1-9之间时需要补0。②函数data功能代入班号,生成班级文件名,用read_excel将对应文件转换为dataframe对象返回。(2)①遍历学生所选学科,统计各科选课人数,以科目为键将结果存入字典km。②空统计技术选考人数占总人数的比例,而总人数可以通过len(df)得到③观察图表x轴数据为科目。(3)略。3.某同学收集了部分城市2022年4月每天24小时空气质量数据,按日分别保存在CSV文件中,部分文件如图a所示。数据格式如图b所示。请回答下列问题:(1)定义函数avg,功能是读取某天的数据文件,计算该天空气质量指数(AQI)的平均值并返回,代码如下。请在划线①处应填入合适的代码。def avg(filename): df=pd.read_csv(filename) df1=df[df.columns[2:]] #取类型及其后的所有列 g=df1.groupby(① ,as_index=False).mean() return ② 划线②处应填入的代码为 (单选,填字母)。 A.df[df.类型=='AQI']B.df1.AQIC.g.AQID.g[g.类型=='AQI'](2)统计本月各城市空气质量最长连续优、良的天数(按照环境空气质量标准,空气污染指数AQI≤50为优级,AQI≤100为良好),代码如下,绘制的图表如图c所示。请在划线处填入合适的代码。import pandas as pdimport matplot1ib.pyplot as pltn=10 #城市个数count=[0]*ndaymax=[0]*nfor i in range(1,31): day=str(i) if len(day) <2: day='0'+str(i) daydata=' 202204'+day+' . csv' dayaqi=avg(daydata) city=dayaqi.columns[1:n+1] for j in range (n): t=city[j] if dayaqi.at[0,t]<=100: ① else: if count[j]>daymax[j]: daymax [j]=count[j] count[j]=0 for k in range (n): if count [k]>daymax[k]: ② print (daymax)plt.bar(③ ,daymax) p1t.show()答案 (1)①'类型' ②D (2)①count[j]+=1 ②daymax[k]=count [k] ③city解析 本题考查pandas及数据处理相关知识。(1)函数要求计算该天空气质量指数(AQI)的平均值,故应按“类型”分组并求平均,返回AQI的平均值,②中需筛选出类型是AQI的记录。(2)①处统计连续优、良的天数,当dayaqi.at[0,t]<=100时,该城市计数器加1,填count[j]+=1。②处求 count [k]的最大值,填daymax[k]=count [k]。③从题c的图表可以看出,x轴数据为城市名称,从city=dayaqi. columns[1:n+1]可以看出,city是城市名称列表。4.小明是智能门禁系统的管理员,他导出某天学生晚自习后回寝室的刷卡数据到文件sj.xlsx中,部分数据如图a所示。学生编号由4位年级号+2位班级号+2位学号组成(每班学号依次从1号开始按顺序编号,若某班有50人,则该班学生学号依次从1-50号编号);刷卡时间为计算方便,已转为分钟;进出门状态的值为0表示出门,1表示进门。小明编写Python程序,统计并输出当晚每班未刷卡进门的学生学号。(1)主程序如下,请在划线处填入合适的代码。import pandas as pdimport matplotlib.pyplot as pltdf=pd.read_excel("sj.xlsx")df=df.sort_values( ,ascending=True) #df 按学生编号升序排序 '''字典 clas中存入每班总人数,如 clas={"高一 1 班":53,"高一 2 班":49,...}表示高一 1 班人数为53人,高一 2 班人数为49人,代码略'''for i in clas: d=df[df['班级']==i] #从df中筛选出班级为i的数据存到d #将d的行索引重置,依次从0开始编,代码略 wd=pclass(d,clas[i]) #若班级 i 未刷卡进门的学生学号为3,7,则wd=[3,7] #输出班级 i 未刷卡进门的学生学号,代码略(2)定义函数pclass(d,num),功能是返回某班级未刷卡进门的学生学号。若学生未刷卡,则认为该学生未刷卡进门;若学生多次刷卡,以学生当晚最后刷卡的状态作为是否刷卡进门的依据,请在划线处填入合适的代码。def pclass(d,num): c=[0]*(num+1) #列表c中有num+1个元素,均为0 li=[];i=0 while i bh=d.at[i,"学生编号"] #读取行索引 i、列标签"学生编号"的值赋值给 bh tm=d.at[i,"刷卡时间"];t=d.at[i,"进出门状态"] j=i+1 while j if d.at[j,"学生编号"]!=bh: ① else: if ② : t=d.at[j,"进出门状态"] tm=d.at[j,"刷卡时间"] j=j+1 i=j bh=str(bh) c[ ③ ]=t for i in range(1,num+1): if c[i]==0: li.append(i) return li(3)根据df中的数据,统计寝室各门的人流量,绘制如图b所示的柱形图,实现该功能的部分Python程序如下:df1=df.groupby("刷卡门号",as_index=False).count()#设置绘图参数,代码略plt.bar(x,y,label="经过该门的人数")程序的方框中应填入的正确代码为 (单选,填字母)。 A.x=df['刷卡门号']y=df['学生编号']B.x=df1['刷卡门号']y=df1['学生编号']C.x=df['刷卡门号']y=range(0,100,20)D.x=df1['刷卡门号']y=range(0,100,20)答案 (1)"学生编号" (2)①break②d.at[j,"刷卡时间"]>tm ③int(bh[6:]) (3)B解析 (1)按学生编号升序排序,因此关键字为"学生编号"。(2)①经过排序后,同一学生的所有记录排列在一起,若满足条件d.at[j,"学生编号"]!=bh,则第j行数据与第i行数据不是同一个学生,结束当前学生统计。②若学生多次刷卡,以学生当晚最后刷卡的状态作为是否刷卡进门的依据。③取出编号最后两位数字,就是该学生在班级中的流水号。(3)按刷卡门号分组统计各个记录数后,将统计存储在df1对象中,因此应利用df1对象创建图表,横轴为df1['刷卡门号'],纵轴可以是df1对象中学生编号、班级等列。5.某校高三首考后,汇总了学生7选3成绩以及次考科目弃考情况(注意:1表示次考弃考,0表示参加次考),ckqk.xlsx文件部分数据如图a所示,现要统计各班人均弃科目考门数和各科次考弃考比例,编写如下Python程序。请回答下列问题:(1)下列代码读取ckqk.xlsx文件,输出各班每人平均弃考门数,输出格式如图b所示,则划线处应填写的代码为 (单选,填字母)。 A.groupby('班级').弃考门数.mean()B.groupby('班级',as_index=False)['弃考门数'].mean()import pandas as pddf=pd.read_excel('ckqk.xlsx')df['弃考门数']=df[['弃考科目1','弃考科目2','弃考科目3']].sum(axis=1)dfg=df. print(dfg)(2)统计7选3每门科目选考人数和弃考人数,并计算各科目弃考比例,Python程序如下,请在划线处填写合适的代码。courses={}for i in df.index: for k in range(1,4): subject=df.at[i,'科目%d'%k] if ① : courses[subject]=[1,0] #[1,0]表示当前为本科目第1个人,弃考人数初值置0 else: courses[subject][0]+=1 abandon=df.at[i,'弃考科目%d'%k] if abandon==1: ② dfs=pd.DataFrame(courses)dfs=dfs.Tdfs=dfs.rename(columns={0:'总人数',1:'弃考人数'})dfs['弃考比例']=round(dfs['弃考人数']/dfs['总人数']*100,1)dfs=dfs.sort_values('弃考比例',ascending=False)(3)编写代码绘制如图c所示图表,则7先3科目中次考弃考比例超30%的有① 门。为实现该功能,请在下面划线处填入合适代码。 import matplotlib.pyplot as pltplt.bar(dfs.index,② ,label='弃考比例') #设备绘图参数,代码略答案 (1)B (2)①subject not in courses 或 not subject in courses ②course[subject][1]+=1(3)①5 ②dfs["弃考比例"]解析 (1)根据题图b,分组方法gorupby的相应参数as_index=False。(2)①字典courses每对键值对的结构是:"科目":[选科人数,弃考人数],先判断字典中是否存在相应的键,不存在,就要创建相应的键值对。②如果某同学某科目有弃考,则要对应科目弃考人数累加:course[subject][1]+=1。(3)①略。②根据题图c,柱状图的数据分别是dfs.index,dfs["弃考比例"]。6.第19届杭州亚运会已完美落幕,亚运会赛事以“杭州为主,全省共享”的原则分布在杭州、宁波、温州、湖州、绍兴、金华各地。大会共有40个大项,61个分项,最终诞生了481块金牌。小李作为一名体育爱好者想重温大会赛程安排,他从杭州亚运会的官网上采集了相关数据,整理后存储在“杭州第19届亚运会总赛程.xlsx”文件中。如图a所示(0表示有赛事但不产生金牌,其他数字表示当天产生的金牌数)。为了更清楚地了解相关赛事信息,小李编写了Python程序,请回答以下问题。(1)足球是小李最关注的大项,为了解足球的赛程安排,划线处应填入的代码为 (单选,填字母)。 A.df.大项=="足球"B.df["大项"=="足球"]C.df[df.大项=="足球"]D.df[df["大项"]==足球]import pandas as pddf=pd.read_excel("杭州第19 届亚运会总赛程.xlsx")df2= print(df2)(2)足球项目的比赛分布在杭州等城市的八个场馆,了解各个场馆举办足球赛事的具体场次,找到连续举办足球赛事最多的场馆,如图b所示。程序代码如下,请在划线处填入合适的代码。黄龙体育中心体育场[9/19,9/21,9/24,9/27,9/28,10/1,10/4,10/6,10/7] 临平体育中心体育场[9/19,9/21,9/22,9/24,9/25,9/28,9/30,10/3] 上城体育中心体育场[9/20,9/22,9/24,9/25,9/27,9/28,10/1,10/3,10/7] 萧山体育中心体育场[9/19,9/20,9/21,9/22,9/24,9/25,9/27,9/28,10/1,10/4] 金华体育中心体育场[9/19,9/21,9/24,9/27] 浙江师范大学东体育场[9/19,9/21,9/24,9/27] 温州奥体中心体育场[9/21,9/22,9/24,9/25,9/27,9/28,9/30] 温州体育中心体育场[9/22,9/24,9/25,9/27,9/28,9/30] 连续举办足球赛事最多的场馆:萧山体育中心体育馆图bdic={}max=0;maxsta=""lst=df2.竞赛场馆.tolist()#将数据转换为列表for i in lst: dic[i]=[]for i in df2.index: c=0 sta=df2["竞赛场馆"][i] for j in df2.columns[2:-3]: if df2.at[i,j]==0 or df2.at[i,j]==1: ① c=c+1 if c>max: max=c;maxsta=sta else: ② for i in dic: print(i,dic[i])print("连续举办足球赛事最多的场馆:",③ ) (3)足球在亚运会期间总共产生两枚金牌,统计分析其他大项产生的金牌总数,找出产生金牌总数最多的十个大项,并绘制图形如图c所示。程序代码如下,请在划线处填入合适的代码。import matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['simhei']#图表中文标签显示为黑体grp=df.groupby(① ,as_index=False).金牌总数.sum() grp=grp.sort_values("金牌总数",ascending=False). ② x=grp.大项y=grp.金牌总数#设置图表参数,代码略。答案 (1)C (2)①dic[sta].append(j)或 dic[sta]+=[j] ②c=0 ③maxsta (3)①"大项" ②head(10)解析 (1)了解足球的赛程安排需符合"大项"列中值为"足球"的记录。(2)①遍历每行的第3列到倒数第4列,若这些单元格中值为0或1,表示该天举办足球赛事,将当天日期j添加到字典dic以场馆名称sta为键的值中。②统计连续举办足球赛事最多的场馆,若当天没有赛事,则将连续天数s的值置为0。③连续举办足球赛事最多的场馆名称保存在变量maxsta。(3)①统计分析其他大项产生的金牌总数,需按大项进行分类统计。②grp对象的sort_values方法是按金牌进行降序排列,找出产生金牌总数最多的十个大项,因此需用head函数。 展开更多...... 收起↑ 资源列表 8.1 利用pandas进行数据统计.docx 8.1 利用pandas进行数据统计无答案.docx