资源简介 课时13 利用pandas进行数据统计(二)【学业要求】知识点 学业水平等级1.掌握DataFrame对象数据集的遍历。 42.掌握编写程序代码,并利用pandas常用函数进行复杂问题的数据统计。 4(2024年6月浙江选考)某学院举行运动会,比赛设跳高、100米等项目,每个项目分男子组和女子组。现要进行报名数据处理和比赛成绩分析。请回答下列问题:运动会报名规则为:对于每个项目的男子组和女子组,每个专业最多各报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 = dfl.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)A (2)score=f[rank-1]或score=f[int(rank)-1] (3)①专业 ②B解析 本题考查利用pandas模块进行数据处理。(1)A选项分二次筛选后,得到该专业男生参加跳高的人数,并检查数据。(2)名次为1-8的可以在列表f中取出对应的得分,但列表的索引下标是从0开始的。(3)①从图表中可以看出是按"专业"进行分组;②图表横轴为专业名称,纵轴为各专业的得分情况。【典例】 (2025年6月浙江选考)水质监测系统已采集了某水域一年的pH数据,该水域pH值的正常范围为6-8。现要对这些数据进行分析,请回答下列问题:(1)将监测点1的数据导出,存于pHdata.xlsx文件中,如图a所示。现要找出pH均值最高的月份,并统计该月pH大于8的日分布情况,绘制如图b所示的柱形图。实现上述功能的部分Python程序如下,请选择合适的代码填入划线处(单选)。import pandas as pdimport matplotlib.pyplot as pltdf=pd.read_excel("pHdata.xlsx")dfl=df.groupby("月",as_index=False).pH.mean()#分组求平均df2=① #将df2首行的月份存入m,代码略print("pH值最高月份序列为:",m)df_m=② df_ex=df_m[df_m["pH"]>8]#筛选df_cnt=③ #重命名pH列名称为"次数",代码略plt.bar(df_cnt["日"],df_cnt["次数"])#设置绘图参数,显示如图b所示的柱形图,代码略程序中①②③处可选的代码有: 。 A.df[df["月"]==m]B.df2[df2["月"]==m]C.df.sort_values("pH",ascending=False)#降序排序D.df_ex.groupby("日",as_index=False).pH.count()#分组计数E.df1.sort_values("pH",ascending=False)F.df_ex.groupby("时",as_index=False).pH.count()(2)将7-12月的pH数据存储于列表data中,要求出一个最长连续序列,其中每个pH值均在正常范围内。如果这样的序列有多个,则选择数值总和最小的序列(若仍有多个,选择最早出现的),输出其长度和起始下标。实现上述功能的部分Python程序如下,请在划线处填入合适的代码。#读入pH数据,按采集的时间顺序存储于列表data中,代码略maxn=start=maxt=0① while i if 6<=data[i]<=8: total=0 k=i while i total+=data[i] i+=1 ② if n>maxn: maxn=n start=k maxt=total elif ③ : star=k maxt=total i+=1#输出最长连续序列的长度maxn和起始下标start,代码略思维点拨明考向 本题考查利用pandas模块进行数据统计与可视化以及基础算法精点拨 (1)①对按月分组后的数据df1按pH值降序排序,得到pH值最高的月份m。②在原始数据df筛选出月份为m的所有数据。③按日分组统计每日出现的次数(即每日有几条记录满足条件)。(2)①指针i从0开始遍历列表data。②当条件i答案 (1)①E ②A ③D (2)①i=0 ②n=i-k③n==maxn and total【变式】 某学校开设选修课并在期末让学生对其进行满意度调查,选修课分艺术、体育、语言、计算机、职业技能等领域。现要进行报名数据处理和满意度分析, 请回答下列问题:(1)选修课开设的条件为:报名人数大于20人。其中计算机类选修课的报名数据保存在DataFrame对象df中,如图a所示。若要编写Python程序检查其中第1学期的“数字视音频处理”选修课是否符合开设条件,下列方法中,不正确的是 (单选,填字母)。 A.对df中数据按开设学期排序并保存到dfs中,再从dfs筛选出选修课名称为“数字视音频处理”的数据,判断筛选出的数据行是否超过20行B.从df中筛选出选修课名称为“数字视音频处理”的数据dfs,再对dfs按开设学期进行升序排序,判断数据前21行的开设学期是否是第1学期C.从df中筛选出选修课名称为“数字视音频处理”的数据dfs,再按开设学期分组统计个数,判断第1学期的个数是否超过20(2)计算机类选修课学生的满意度调查部分数据如图b所示。满意度分3个等级:A.满意、B.一般、C.不满意,分别计1分、0分、-1分,基础分为100分。实现计算各选修课的满意度功能的部分Python程序如下,请在划线处填入合适的代码。import pandas as pdimport matplotlib.pyplot as plt#读取如图b所示数据,保存到DataFrame对象df1中,代码略score=[1,0,-1]for i in range(0,len(df1)): rank=df1.at[i,"满意度"] ① df1.at[i,"得分"]=marka=df1.groupby("选修课名称",as_index=False)["得分"].② for i in range(0,len(a)): a.at[i,"得分"]+=100(3)根据满意度进行降序排序,绘制如图c所示的柱形图,实现该功能的部分Python程序如下:图ca=a.sort_values("① ",ascending=False) #设置绘图参数,代码略x=② y=a["得分"]plt.bar(x,y) #绘制柱形图答案 (1)A (2)①mark=score[ord(rank)-ord("A")]或mark=score[ord(rank)-65]②sum() (3)①得分 ②a["选修课名称"]或 a.选修课名称解析 本题考查利用pandas进行数据统计。(1)A选项筛选出的数据行包含其他学期的记录。(2)①满意度的等级依次为ABC,对应score中3个得分,需将ABC转换成012的索引,并在score列表中取出相应的值。②求出每门选修课的得分之和,因此该处为求和函数。(3)①从图上来看,是按得分降序排列。②图表的横轴为各门选修课的名称,需要从排好序的a对象中取出选修课名称列的内容。 DataFrame是pandas处理的主要对象,index属性记录了每行记录所在的行索引,columns属性记录每列的名称。df.列名就可以表示该列所有的数据的集合,可以运用函数计算一个集合对象的记录数量、总和、平均值和最值(最大值或最小值)。通过筛选找到符合处理条件的数据(子集)集合,再对集合进行求和等计算。通过分组,将某列相同字段值的记录组合在一起,形成一个个的分组,再分别统计各个分组的数量、和、平均值和最值。1.为研究某项疾病与年龄的关系,某医院对以前的诊断记录进行整理和分析,整理部分数据如图a所示。姓名 年龄 疾病毕蕴琪 52 疾病A蔡丹婷 26岁 疾病D蔡伟剑 十四岁 疾病E陈芝伊 78 疾病B丁佳菲 35 疾病A…… …… ……图a(1)观察图a所示数据,发现年龄列数据格式不一致为了便于数据分析,下列操作合适的是 (单选,填字母)。 A.删除“年龄”列数据B.将“年龄”列含有中文字的记录删除C.将“年龄”列数据转为文本类型D.将“年龄”列含有中文字的记录修改为只包含数字的年龄(2)将数据整理好后,为了统计0~18、19~35、36~60、61以上(含61)四个年龄段的某疾病患病人数占该疾病总患病人数的比例,并绘制如图b示图表,编写如下Python程序,请在划线处填入合适代码。import pandas as pdimport matplotlib.pyplot as pltdf = pd.read_excel('data.xlsx')tp = input('请输入疾病类型:')df1 = ① #筛选tp疾病的数据 count = [0] * 4for i in df1.index: age = df.at[i, '年龄'] if ② : count[0] += 1 elif age <= 35: count[1] += 1 elif age <= 60: count[2] += 1 else: count[3] += 1x = ['0-18', '19-35', '36-60', '61以上']y = []for i in range(4): y.append(③ ) plt.bar(x, y) #显示不同年龄段患该病的人数百分比#设置图表其他参数,代码略(3)观察图b,“疾病A”患病比例最大的年龄段为 。 (4)若想获取61岁及以上的人群中,患病率最高的10种疾病,编写如下程序。def get_head10(df, age): return df.疾病.head(10)print(get_head10(df, 61))上述程序段中方框处可选代码为:①df = df.sort_values("年龄", ascending=False)②df = df[df.年龄>=age]③df = df.groupby("疾病", as_index=False).count()则加框处应填代码的顺序依次为 (单选,填字母)。 A.①②③ B.①③②C.②①③ D.②③①答案 (1)D (2)①df[df.疾病==tp]②age<=18 ③count[i]/sum(count)*100或count[i]/len(df1)*100 (3)0-18 (4)D解析 本题考查pandas数据处理。(1)略。(2)①在df中查找符合条件df['疾病']==tp的记录。②count数组统计各个年龄段的人数。③图表显示不同年龄段患该病的人数百分比,将各个年龄人数占该疾病类型的人数百分比。(3)略。(4)数据处理的顺序是:筛选、分组统计、排序(降序)。若要统计患病率,需按疾病类型进行分组统计,形成如图所示数据。其中姓名列和年龄列为统计的人数,若要找出人数最多的需按其中一个关键字进行降序排列。疾病 姓名 年龄0 疾病A1 疾病B2 - - -疾病F2.某单位根据全省各县市区的公共设施与服务运行情况,编制了“公共服务惠民指数”与“公共设施匹配指数”,现要对该两项指数进行分析。请回答下列问题:(1)该单位希望在所有县市区中,筛选出“公共服务惠民指数”低于75分的县市区,提出预警。各县市区的指数数据保存在DataFrame对象df中,如图a所示。实现上述功能的部分Python程序如下:df1 = df[df["公共服务惠民指数"] < 75]print("需要被预警的县市区个数为", ,"个") 下列语句中,符合要求的为 。(单选,填字母) A.df1.count()B.len(df1)C.df1["公共服务惠民指数"].sum()(2)根据图a中数据中的区域代码列的前4位,可以获取到该区域所属的地区,例如“3301”即代表“杭州市”。现需要根据该数据,匹配出各县市区所属的地区。实现上述功能的部分Python程序如下,请在程序中划线处填入合适的代码。import pandas as pdimport matplotlib.pyplot as pltarea = {"3301":"杭州市","3302":"宁波市",……,"3311":"丽水市"}df = pd.read_excel("基层智治指数.xlsx")df.insert(4,"地区","") #在第4列插入“地区”列,值为空for i in df.index: areacode = str(df.at[i,"区域代码"]) df.at[i,"地区"]= df = df.drop("区域代码" ,axis= 1)(3)根据上述df中的地区信息,统计各地区“公共服务惠民指数”与“公共设施匹配指数”的平均值,并根据“公共服务惠民指数”数据绘制如图b所示的柱形图,实现该功能的部分Python程序如下:dfg = df.groupby("地区"). dfs = dfg.sort_values( )#设置绘图参数,代码略plt.title("公共服务惠民指数")plt.bar(dfs.index,dfs["公共服务惠民指数"])#绘制柱形图①请在程序中划线处填入合适的代码。②程序中的方框中应填入的正确代码为 (单选,填字母)。 A."公共服务惠民指数", ascending = TrueB."公共服务惠民指数", ascending = FalseC.dfg["公共服务惠民指数"], ascending = TrueD.dfg["公共服务惠民指数"], ascending = False答案 (1)B (2)area[areacode[0:4]](3)①mean() ②B解析 (1)A选项count函数统计记录的数量。B选项len(df1)是取得df1的行数。C选项对公共服务惠民指数这个列的数据求和。(2)根据第i行的区域代码列字符串中的前4位,在字典area中获取对应的地区名称,赋给第i行的地区列。(3)①根据地区分组统计多个列的平均值。②根据图中可知要对dfg的数据按公共服务惠民指数进行降序排序。3.小明通过调查问卷收集了食堂满意度情况数据,保存在“data.csv”文件,如图a所示。调查项目 总票数 满意 一般 不满意0 饭菜质量 1059 482 512 651 饭菜价格 1059 419 556 842 菜品花样 1059 485 513 613 餐厅环境 1059 732 321 64 服务质量 1059 718 312 295 餐厅整体 1059 377 554 128图b为统计分析每个调查项目不同选项的人数及不满意率,编写Python程序。请回答下列问题:(1)统计每一项调查内容的总票数、满意、一般及不满意人数,程序运行结果如图b所示,import pandas as pdimport matplotlib.pyplot as plt #导入模块df=pd.read_csv("data.csv",encoding="utf-8")#读取csv文件中的数据cols=df.columns[1:]poll=len(df)data= {"调查项目":[],"总票数":[],"满意":[],"一般":[],"不满意":[]}for colname in cols: dfc=df.groupby(① ,as_index=False)["序号"].count() data["调查项目"].append(colname) data["总票数"].append(poll) for j in dfc.index: name=dfc.at[j,colname] data[name].append(② ) df2=pd.DataFrame(data) ; print(df2)(2)计算每个项目的“不满意率”(=“不满意”/“总票数”*100),并使用柱形图分析每个项目的“不满意率”情况,如图c所示,请在划线处填入合适的代码。图cdf2["不满意率(%)"]=① x=② y=df2["不满意率(%)"]plt.figure(figsize=(8,4))pl.title("食堂调查问卷不满意率(%)情况")plt.bar(x,y,label="不满意率(%)")plt.legend()答案 (1)①colname②dfc.at[j,"序号"]或dfc["序号"][j]或dfc.序号[j](2)①df2["不满意"]/df2["总票数"]*100或df2["不满意"]/po1l*100或df2.不满意/df2.总票数*100或df2.不满意/pol1*100或其他等价答案②df2["调查项目"]或df2.调查项目解析 (1)①一共有饭菜质量、饭菜价格等6个项目,每个项目都有满意、一般和不满意三个选项,因此需进行6次对不同项目进行分组统计,cols为项目名称的集合,colname是每个项目的名称,因此需按colname进行分组并统计各个选项的个数。以饭菜质量为例,得到的dfc对象如表所示。饭菜质量 序号0 满意 4821 一般 5122 不满意 65②dfc对象是每个项目colname的满意、一般和不满意3个项目的投票数,遍历该对象,name是每个选项的名称,因此需将每个选项的值添加到字典中去。(2)根据字典data创建了一个df2对象,①将在df2对象中新增"不满意率(%)"列,其值计算方法为不满意选项数除以总得票数,在图表中可知,其值大于1,因此需乘以100。②创建图表的x轴为各个调查项目。1.小红收集了某平台的销售数据,部分数据如图a所示。为了在销售利润最高的“商品品类”的客户中,统计出不同年龄段的人数,她编写Python程序如下。请回答下列问题:(1)计算订单“销售利润”的规则为:销售利润=销售单价×销售数-进货总价。实现该计算的Python程序如下,请在划线处填入合适的代码。import pandas as pdimport matplotlib.pyplot as pltdf=pd.read_excel("data.xlsx")df["销售利润"] = (2)找出销售利润总和最高的“商品品类”并存储在 maxt 中。实现该功能的Python 程序如下,请在划线处填入合适的代码。df1=df.groupby("① ").sum() maxt=df1.index[0]for i in df1.index[1:]: pft=df1.at[i,"销售利润"] if pft>df1.at[maxt,"销售利润"] : ② (3)为统计maxt中不同客户年龄段的人数,程序运行结果如图b所示,部分Python程序如下,请在划线处填入合适的代码。图bnums=[0]*5; ages=[30,40,50,60]df2=df[df.商品品类==maxt].sort_values("客户年龄")j=0;n=len(df2)for i in range(0 , 4): st = j while j j=j+1 nums[i]=① nums[4] = len(df2) -jxlabel = ["30 岁以下" , "31-40 岁" , "41-50 岁" , "51-60 岁" , "61 岁以上"]plt.bar(xlabel ,② ) plt.show( )答案 (1) df["销售单价"]*df["销售数"]-df["进货总价"]或 df.销售单价 * df.销售数-df.进货总价 (2)① 商品品类 ②maxt=i (3)① j-st②nums解析 (1)根据计算公式,可得代码为df["销售单价"]*df["销售数"]-df["进货总价"] (2)①统计每个商品品类的销售总和,应按商品品类分组统计。②maxt初值为索引df1.index[0],遍历每个商品品类行索引,若该行的销售利润大于最大行所在利润,更新变量maxt的值为当前行i。(3)①df2中已经按年龄升序排列,变量st是每个年龄段的起点,while循环结束后的变量j是下一年龄段的起点,所以当前年龄段人数是:j-st;②plt.bar是绘制柱形图,柱形图的高度数据保存在列表nums中,所以直接填nums即可。2.某学校高二年级举办投篮比赛,每人投球5次,比赛数据存储在“scores.csv”文件中,“投球情况”中1表示投中,0表示投失,如图a所示。计分规则为:投中得1分,投失不得分;若连续投中,该球得分为前一球得分的2倍。请回答下列问题:(1)若某同学投球情况是“11011”,则得分是 分。 (2)自定义函数fcount功能是根据计分规则计算投球得分的程序代码如下,请在划线处填入合适的代码。def fcount(data): total,temp=0,0 for i in range(len(data)): if ① : temp=1 elif data[i]=='1': ② else: temp=0 total+=temp return total(3)读取数据,计算各人得分。请在划线处填入适合的代码。df1=pd.read_csv('scores.csv',converters={'投球情况':str})for i in df1.index: cj=fcount( ) df1.at[i,'分数']=cj(4)统计班级平均分,根据班级平均分前5名的数据绘制柱形图,如图b所示。请在划线处填入适合的代码。df2=df1.groupby("班级",as_index=False).① #设置绘图参数,代码略plt.bar(x,y)#绘制柱形图方框中应填入的正确代码为② (多选,填字母) A.dfs=df2.sort_values('分数').tail(5) x=df2["班级"] y=df2["分数"]B.dfs=df2.sort_values('分数,ascending=True)[0:5] x=dfs.index y=dfs["分数"]C.dfs=df2.sort_values('分数',ascending=False) dfs=dfs.head(5) x=dfs["班级"] y=dfs["分数"]D.dfs=df2.sort_values('分数,ascending=False)[0:5] x=dfs["班级"] y=dfs["分数"]答案 (1)6或6分(2)①data[i]=="1" and temp==0②temp=2*temp或temp*=2(3)df1.at[i,"投球情况"]或df1["投球情况"][1](4)①mean() ②CD解析 (1)投球情况为“11011”,得分依次为1,2,0,1,2,共计6分。(2)①data[i]为"1"表示当前投中,而temp存储上一次的情况。②得分是前一球得分的2倍。(3)自定义函数fcount计算当前行的“投球情况”单元格的得分情况,该单元格可以采用属性法、字典法和行列法共三种方法表示。(4)①统计班级平均分的函数是mean。②根据图b可知,要筛选出前5名并且按照降序排列,降序排列ascending应设置为False。3.小周要统计高二年级各班的行为规范得分情况,部分扣分数据如图a所示。(1)观察数据,发现存在重复扣分的记录,如图a第2、3行所示。现需对数据进行整理,以下操作合理的是 (单选,填字母)。 A.对班级、记录员均相同的记录去重B.对日期、关联学生、项目名称均相同的记录去重C.对关联学生、项目名称、项目扣分均相同的记录去重(2)如图a第4行“关联学生”所示,多名学生信息以分号分隔集中登记。现需要将这些关联学生信息进行拆分,每位学生各一条记录。实现拆分功能的部分Python程序如下,请在划线处填入合适的代码。import pandas as pddf=pd.read_excel("高二年级学生行规扣分明细.xlsx")i=0while i s=① t=0 for j in range(len(s)): if s[j]==";": df=pd.concat([df, df[i:i+1]],ignore_index=True) #将当前记录复制并添加到表末尾,concat函数用于连接两个DataFrame对象 df.at[len(df)-1,"关联学生"]=s[t:j] df.at[i,"关联学生"]=s[j+1:] ② i=i+1(3)该校高二年级共有16个班级,统计各班的行为规范得分(班级行为规范得分=100分-本班所有学生扣分),并绘制如图b所示的柱形图,实现该功能的部分Python程序如下,请在划线处填入合适的代码。import matplotlib.pyplot as pltpoint=df.groupby("① ",as_index=False).sum() cla=[100]*16for i in range(len(point)): m=point.at[i,"班级"] cla[m-1]-=point.at[i,"项目扣分"]x=[str(i)+"班" for i in range(1,17)]y=② #设置绘图参数,代码略plt.bar(x,y)plt.show()答案 (1)B (2)①df["关联学生"][i]或df.关联学生[i]或df.at[i,"关联学生"] ②t=j+1(3)①班级 ②cla解析 (1)日期、关联学生、项目名称都相同,那么这两条记录是重复。(2)①索引为i的“关联学生”列的名称为df["关联学生"][i]。②从表达式s[t:j]来看,变量t的表示一位学生的开始索引位置,若当前位置的值为引号,则下一位学生的索引位置从j+1开始。(3)①计算每个班级的得分,因此须按班级进行分组统计。②列表cla中存储每个班级的得分。4.某单位正式员工的基本工资计算公式为:基本工资=岗位工资+薪级工资,如图a和图b,分别对应salary1.xlsx文件和salary2.xlsx文件。员工入职单位一年后转正,定岗位等级为十三级,根据学历定起始的薪级,中专2级、大专5级、本科7级、硕士11级、博士14级。转正定级后,薪级每年增加一级。为统计分析该单位员工的工资情况,编写Python程序。请回答下列问题:(1)定义岗位工资和薪级工资标准查询的两个函数。gwgz函数功能为:读取salary1.xlsx文件,根据岗位等级m,返回对应的工资标准,例如m=“十三级”,gwgz(m)=1585。函数代码如下,划线处应填入的代码为 (单选,填字母)。 A.df1.'岗位等级'[i]==mB.df1[岗位等级][i]==mC.df1['岗位等级'][i]==mD.df1[i]['岗位等级']==mimport pandas as pddef gwgz(m): df1=pd.read_excel('salary1.xlsx') for i in df1.index: if : return df1.at[i,'工资标准']xjgz函数功能为:根据薪级等级n,返回对应的工资标准,例如n=10,xjgz(n)=661,代码略。(2)现有员工信息表info.xlsx,所有员工都已经过了实习期,如图c。统计各学历的人数和基本工资的平均值,编写Python程序。请回答下列问题:import matplotlib.pyplot as pltimport datetimedic={'中专':2,'大专':5,'本科':7,'硕士':11,'博士':14}time=datetime.date.today() #获得当前的年月日now_year=time.year #获取年份now_month=time.month #获取月份df=pd.read_excel('info.xlsx')for i in df.index: station=df.at[i,'岗位等级'] past_year=int(df.at[i,'入职年月'][:4]) past_month=int(df.at[i,'入职年月'][5:]) if now_month >=past_month: grade=now_year-past_year-1 else: grade=now_year-past_year-2 grade+=① df.at[i,'基本工资']=② #计算员工的基本工资 #对各学历的员工计算平均基本工资和统计人数df1=df.groupby('学历',as_index=False).agg({'基本工资':'mean','姓名':'count'}) #修改列名df2=df1.rename(columns={'基本工资':'平均工资',"姓名":"人数"}) #图表对象初始化,代码略plt.bar(df2.学历,df2.平均工资,label="平均工资") #绘制柱形图plt.plot(df2.学历,③ ,label="人数") #绘制线形图plt.legend()plt.show()(3)目前该单位平均工资为3867.33元,由图d可知,学历为 的员工,他们的平均工资与公司平均工资相差最大。 答案 (1)C (2)①dic[df.at[i,'学历']]②gwgz(station)+xjgz(grade) ③df2.人数 (3)博士解析 本题考查pandas数据处理。(1)根据岗位等级m,返回对应的工资标准。(2)①grade表示工作年限,其值为参加工作时间加上学历时间(读大学的年数)。②计算员工的基本工资,基本工资=岗位工资+薪级工资。③线性图的纵轴为人数。(3)略。5.某同学收集了部分城市2022年4月每天24小时空气质量数据,按日分别保存在csv文件中,部分文件如图a所示。数据格式如图b所示。请回答下列问题:图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.AQI C.g.AQID.g[g.类型=='AQI'](2)统计本月各城市空气质量最长连续优、良的天数(按照环境空气质量标准,空气污染指数 AQI≤50为优级,AQI≤100 为良好),代码如下,绘制的图表如图 c 所示。请在划线处填入合适的代码。图cimport 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)p1t.figure(figsize=(12,4))x= ③ y=daymaxplt.bar(x, y)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是城市名称列表。6.小明是智能门禁系统的管理员,他导出某天学生晚自习后回寝室的刷卡数据到文件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对象中学生编号、班级等列。(共84张PPT)必修一 数据与计算课时13 利用pandas进行数据统计(二)知识点 学业水平等级1.掌握DataFrame对象数据集的遍历。 42.掌握编写程序代码,并利用pandas常用函数进行复杂问题的数据统计。 4目 录CONTENTS真题剖析01课堂突破02当堂检测03课后作业04真题剖析1(2024年6月浙江选考)某学院举行运动会,比赛设跳高、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程序如下:①请在程序中划线处填入合适的代码。②程序的方框中应填入的正确代码为________(单选,填字母)。 A.x=df1["专业"]y=df1["总分"]B.x=df2["专业"]y=df2["得分"]C.df1["专业"]="专业"df1["总分"]="总分"D.df2["专业"]="专业"df2["得分"]="得分"答案 (1)A (2)score=f[rank-1]或score=f[int(rank)-1] (3)①专业 ②B解析 本题考查利用pandas模块进行数据处理。(1)A选项分二次筛选后,得到该专业男生参加跳高的人数,并检查数据。(2)名次为1-8的可以在列表f中取出对应的得分,但列表的索引下标是从0开始的。(3)①从图表中可以看出是按"专业"进行分组;②图表横轴为专业名称,纵轴为各专业的得分情况。课堂突破2【典例】 (2025年6月浙江选考)水质监测系统已采集了某水域一年的pH数据,该水域pH值的正常范围为6-8。现要对这些数据进行分析,请回答下列问题:(1)将监测点1的数据导出,存于pHdata.xlsx文件中,如图a所示。现要找出pH均值最高的月份,并统计该月pH大于8的日分布情况,绘制如图b所示的柱形图。实现上述功能的部分Python程序如下,请选择合适的代码填入划线处(单选)。import pandas as pdimport matplotlib.pyplot as pltdf=pd.read_excel("pHdata.xlsx")dfl=df.groupby("月",as_index=False).pH.mean()#分组求平均df2=①________#将df2首行的月份存入m,代码略print("pH值最高月份序列为:",m)df_m=②________df_ex=df_m[df_m["pH"]>8]#筛选df_cnt=③________#重命名pH列名称为"次数",代码略plt.bar(df_cnt["日"],df_cnt["次数"])#设置绘图参数,显示如图b所示的柱形图,代码略程序中①②③处可选的代码有:________。 A.df[df["月"]==m]B.df2[df2["月"]==m]C.df.sort_values("pH",ascending=False)#降序排序D.df_ex.groupby("日",as_index=False).pH.count()#分组计数E.df1.sort_values("pH",ascending=False)F.df_ex.groupby("时",as_index=False).pH.count()(2)将7-12月的pH数据存储于列表data中,要求出一个最长连续序列,其中每个pH值均在正常范围内。如果这样的序列有多个,则选择数值总和最小的序列(若仍有多个,选择最早出现的),输出其长度和起始下标。实现上述功能的部分Python程序如下,请在划线处填入合适的代码。#读入pH数据,按采集的时间顺序存储于列表data中,代码略maxn=start=maxt=0①________while i if 6<=data[i]<=8: total=0 k=i while i total+=data[i] i+=1 ②________ if n>maxn: maxn=n start=k maxt=total elif ③__________: star=k maxt=total i+=1#输出最长连续序列的长度maxn和起始下标start,代码略答案 (1)①E ②A ③D (2)①i=0 ②n=i-k ③n==maxn and total思维点拨 明考向 本题考查利用pandas模块进行数据统计与可视化以及基础算法精点拨 (1)①对按月分组后的数据df1按pH值降序排序,得到pH值最高的月份m。②在原始数据df筛选出月份为m的所有数据。③按日分组统计每日出现的次数(即每日有几条记录满足条件)。(2)①指针i从0开始遍历列表data。②当条件i【变式】 某学校开设选修课并在期末让学生对其进行满意度调查,选修课分艺术、体育、语言、计算机、职业技能等领域。现要进行报名数据处理和满意度分析, 请回答下列问题:(1)选修课开设的条件为:报名人数大于20人。其中计算机类选修课的报名数据保存在DataFrame对象df中,如图a所示。若要编写Python程序检查其中第1学期的“数字视音频处理”选修课是否符合开设条件,下列方法中,不正确的是________(单选,填字母)。 A.对df中数据按开设学期排序并保存到dfs中,再从dfs筛选出选修课名称为“数字视音频处理”的数据,判断筛选出的数据行是否超过20行B.从df中筛选出选修课名称为“数字视音频处理”的数据dfs,再对dfs按开设学期进行升序排序,判断数据前21行的开设学期是否是第1学期C.从df中筛选出选修课名称为“数字视音频处理”的数据dfs,再按开设学期分组统计个数,判断第1学期的个数是否超过20(2)计算机类选修课学生的满意度调查部分数据如图b所示。满意度分3个等级:A.满意、B.一般、C.不满意,分别计1分、0分、-1分,基础分为100分。实现计算各选修课的满意度功能的部分Python程序如下,请在划线处填入合适的代码。import pandas as pdimport matplotlib.pyplot as plt#读取如图b所示数据,保存到DataFrame对象df1中,代码略score=[1,0,-1]for i in range(0,len(df1)): rank=df1.at[i,"满意度"] ①______ df1.at[i,"得分"]=marka=df1.groupby("选修课名称",as_index=False)["得分"].②______for i in range(0,len(a)): a.at[i,"得分"]+=100(3)根据满意度进行降序排序,绘制如图c所示的柱形图,实现该功能的部分Python程序如下:图ca=a.sort_values("①________",ascending=False) #设置绘图参数,代码略x=②______y=a["得分"]plt.bar(x,y) #绘制柱形图答案 (1)A (2)①mark=score[ord(rank)-ord("A")]或mark=score[ord(rank)-65]②sum() (3)①得分 ②a["选修课名称"]或 a.选修课名称解析 本题考查利用pandas进行数据统计。(1)A选项筛选出的数据行包含其他学期的记录。(2)①满意度的等级依次为ABC,对应score中3个得分,需将ABC转换成012的索引,并在score列表中取出相应的值。②求出每门选修课的得分之和,因此该处为求和函数。(3)①从图上来看,是按得分降序排列。②图表的横轴为各门选修课的名称,需要从排好序的a对象中取出选修课名称列的内容。 DataFrame是pandas处理的主要对象,index属性记录了每行记录所在的行索引,columns属性记录每列的名称。df.列名就可以表示该列所有的数据的集合,可以运用函数计算一个集合对象的记录数量、总和、平均值和最值(最大值或最小值)。通过筛选找到符合处理条件的数据(子集)集合,再对集合进行求和等计算。通过分组,将某列相同字段值的记录组合在一起,形成一个个的分组,再分别统计各个分组的数量、和、平均值和最值。当堂检测31.为研究某项疾病与年龄的关系,某医院对以前的诊断记录进行整理和分析,整理部分数据如图a所示。姓名 年龄 疾病毕蕴琪 52 疾病A蔡丹婷 26岁 疾病D蔡伟剑 十四岁 疾病E陈芝伊 78 疾病B丁佳菲 35 疾病A…… …… ……图a(1)观察图a所示数据,发现年龄列数据格式不一致为了便于数据分析,下列操作合适的是________(单选,填字母)。 A.删除“年龄”列数据B.将“年龄”列含有中文字的记录删除C.将“年龄”列数据转为文本类型D.将“年龄”列含有中文字的记录修改为只包含数字的年龄(2)将数据整理好后,为了统计0~18、19~35、36~60、61以上(含61)四个年龄段的某疾病患病人数占该疾病总患病人数的比例,并绘制如图b示图表,编写如下Python程序,请在划线处填入合适代码。import pandas as pdimport matplotlib.pyplot as pltdf = pd.read_excel('data.xlsx')tp = input('请输入疾病类型:')df1 = ①________ #筛选tp疾病的数据 count = [0] * 4for i in df1.index: age = df.at[i, '年龄'] if __②________ : count[0] += 1 elif age <= 35: count[1] += 1 elif age <= 60: count[2] += 1 else: count[3] += 1x = ['0-18', '19-35', '36-60', '61以上']y = []for i in range(4): y.append(③________) plt.bar(x, y) #显示不同年龄段患该病的人数百分比#设置图表其他参数,代码略(3)观察图b,“疾病A”患病比例最大的年龄段为________。 (4)若想获取61岁及以上的人群中,患病率最高的10种疾病,编写如下程序。def get_head10(df, age): return df.疾病.head(10)print(get_head10(df, 61))上述程序段中方框处可选代码为:①df = df.sort_values("年龄", ascending=False)②df = df[df.年龄>=age]③df = df.groupby("疾病", as_index=False).count()则加框处应填代码的顺序依次为________(单选,填字母)。 A.①②③ B.①③②C.②①③ D.②③①答案 (1)D (2)①df[df.疾病==tp] ②age<=18③count[i]/sum(count)*100或count[i]/len(df1)*100 (3)0-18 (4)D解析 本题考查pandas数据处理。(1)略。(2)①在df中查找符合条件df['疾病']==tp的记录。②count数组统计各个年龄段的人数。③图表显示不同年龄段患该病的人数百分比,将各个年龄人数占该疾病类型的人数百分比。(3)略。(4)数据处理的顺序是:筛选、分组统计、排序(降序)。若要统计患病率,需按疾病类型进行分组统计,形成如图所示数据。其中姓名列和年龄列为统计的人数,若要找出人数最多的需按其中一个关键字进行降序排列。 疾病 姓名 年龄0 疾病A 1 疾病B 2 - - - 疾病F 2.某单位根据全省各县市区的公共设施与服务运行情况,编制了“公共服务惠民指数”与“公共设施匹配指数”,现要对该两项指数进行分析。请回答下列问题:(1)该单位希望在所有县市区中,筛选出“公共服务惠民指数”低于75分的县市区,提出预警。各县市区的指数数据保存在DataFrame对象df中,如图a所示。实现上述功能的部分Python程序如下:df1 = df[df["公共服务惠民指数"] < 75]print("需要被预警的县市区个数为",________,"个") 下列语句中,符合要求的为________。(单选,填字母) A.df1.count()B.len(df1)C.df1["公共服务惠民指数"].sum()(2)根据图a中数据中的区域代码列的前4位,可以获取到该区域所属的地区,例如“3301”即代表“杭州市”。现需要根据该数据,匹配出各县市区所属的地区。实现上述功能的部分Python程序如下,请在程序中划线处填入合适的代码。import pandas as pdimport matplotlib.pyplot as pltarea = {"3301":"杭州市","3302":"宁波市",……,"3311":"丽水市"}df = pd.read_excel("基层智治指数.xlsx")df.insert(4,"地区","") #在第4列插入“地区”列,值为空for i in df.index: areacode = str(df.at[i,"区域代码"]) df.at[i,"地区"]=______________ df = df.drop("区域代码" ,axis= 1)(3)根据上述df中的地区信息,统计各地区“公共服务惠民指数”与“公共设施匹配指数”的平均值,并根据“公共服务惠民指数”数据绘制如图b所示的柱形图,实现该功能的部分Python程序如下:dfg = df.groupby("地区").______________#设置绘图参数,代码略plt.title("公共服务惠民指数")plt.bar(dfs.index,dfs["公共服务惠民指数"])#绘制柱形图①请在程序中划线处填入合适的代码。②程序中的方框中应填入的正确代码为________(单选,填字母)。 A."公共服务惠民指数", ascending = TrueB."公共服务惠民指数", ascending = FalseC.dfg["公共服务惠民指数"], ascending = TrueD.dfg["公共服务惠民指数"], ascending = False答案 (1)B (2)area[areacode[0:4]] (3)①mean() ②B解析 (1)A选项count函数统计记录的数量。B选项len(df1)是取得df1的行数。C选项对公共服务惠民指数这个列的数据求和。(2)根据第i行的区域代码列字符串中的前4位,在字典area中获取对应的地区名称,赋给第i行的地区列。(3)①根据地区分组统计多个列的平均值。②根据图中可知要对dfg的数据按公共服务惠民指数进行降序排序。3.小明通过调查问卷收集了食堂满意度情况数据,保存在“data.csv”文件,如图a所示。 调查项目 总票数 满意 一般 不满意0 饭菜质量 1059 482 512 651 饭菜价格 1059 419 556 842 菜品花样 1059 485 513 613 餐厅环境 1059 732 321 64 服务质量 1059 718 312 295 餐厅整体 1059 377 554 128图b为统计分析每个调查项目不同选项的人数及不满意率,编写Python程序。请回答下列问题:(1)统计每一项调查内容的总票数、满意、一般及不满意人数,程序运行结果如图b所示,import pandas as pdimport matplotlib.pyplot as plt #导入模块df=pd.read_csv("data.csv",encoding="utf-8")#读取csv文件中的数据cols=df.columns[1:]poll=len(df)data= {"调查项目":[],"总票数":[],"满意":[],"一般":[],"不满意":[]}for colname in cols: dfc=df.groupby(①__________,as_index=False)["序号"].count() data["调查项目"].append(colname) data["总票数"].append(poll) for j in dfc.index: name=dfc.at[j,colname] data[name].append(②__________) df2=pd.DataFrame(data) ; print(df2)(2)计算每个项目的“不满意率”(=“不满意”/“总票数”*100),并使用柱形图分析每个项目的“不满意率”情况,如图c所示,请在划线处填入合适的代码。图cdf2["不满意率(%)"]=①________x=②________y=df2["不满意率(%)"]plt.figure(figsize=(8,4))pl.title("食堂调查问卷不满意率(%)情况")plt.bar(x,y,label="不满意率(%)")plt.legend()答案 (1)①colname ②dfc.at[j,"序号"]或dfc["序号"][j]或dfc.序号[j](2)①df2["不满意"]/df2["总票数"]*100或df2["不满意"]/po1l*100或df2.不满意/df2.总票数*100或df2.不满意/pol1*100或其他等价答案②df2["调查项目"]或df2.调查项目解析 (1)①一共有饭菜质量、饭菜价格等6个项目,每个项目都有满意、一般和不满意三个选项,因此需进行6次对不同项目进行分组统计,cols为项目名称的集合,colname是每个项目的名称,因此需按colname进行分组并统计各个选项的个数。以饭菜质量为例,得到的dfc对象如表所示。 饭菜质量 序号0 满意 4821 一般 5122 不满意 65②dfc对象是每个项目colname的满意、一般和不满意3个项目的投票数,遍历该对象,name是每个选项的名称,因此需将每个选项的值添加到字典中去。(2)根据字典data创建了一个df2对象,①将在df2对象中新增"不满意率(%)"列,其值计算方法为不满意选项数除以总得票数,在图表中可知,其值大于1,因此需乘以100。②创建图表的x轴为各个调查项目。课时作业41.小红收集了某平台的销售数据,部分数据如图a所示。为了在销售利润最高的“商品品类”的客户中,统计出不同年龄段的人数,她编写Python程序如下。请回答下列问题:(1)计算订单“销售利润”的规则为:销售利润=销售单价×销售数-进货总价。实现该计算的Python程序如下,请在划线处填入合适的代码。import pandas as pdimport matplotlib.pyplot as pltdf=pd.read_excel("data.xlsx")df["销售利润"] =______(2)找出销售利润总和最高的“商品品类”并存储在 maxt 中。实现该功能的Python 程序如下,请在划线处填入合适的代码。df1=df.groupby("①________").sum() maxt=df1.index[0]for i in df1.index[1:]: pft=df1.at[i,"销售利润"] if pft>df1.at[maxt,"销售利润"] : ②______(3)为统计maxt中不同客户年龄段的人数,程序运行结果如图b所示,部分Python程序如下,请在划线处填入合适的代码。图bnums=[0]*5; ages=[30,40,50,60]df2=df[df.商品品类==maxt].sort_values("客户年龄")j=0;n=len(df2)for i in range(0 , 4): st = j while j j=j+1 nums[i]=①______ nums[4] = len(df2) -jxlabel = ["30 岁以下" , "31-40 岁" , "41-50 岁" , "51-60 岁" , "61 岁以上"]plt.bar(xlabel ,②________) plt.show( )答案 (1) df["销售单价"]*df["销售数"]-df["进货总价"]或 df.销售单价 * df.销售数-df.进货总价 (2)①商品品类 ②maxt=i (3)① j-st ②nums解析 (1)根据计算公式,可得代码为df["销售单价"]*df["销售数"]-df["进货总价"] (2)①统计每个商品品类的销售总和,应按商品品类分组统计。②maxt初值为索引df1.index[0],遍历每个商品品类行索引,若该行的销售利润大于最大行所在利润,更新变量maxt的值为当前行i。(3)①df2中已经按年龄升序排列,变量st是每个年龄段的起点,while循环结束后的变量j是下一年龄段的起点,所以当前年龄段人数是:j-st;②plt.bar是绘制柱形图,柱形图的高度数据保存在列表nums中,所以直接填nums即可。2.某学校高二年级举办投篮比赛,每人投球5次,比赛数据存储在“scores.csv”文件中,“投球情况”中1表示投中,0表示投失,如图a所示。计分规则为:投中得1分,投失不得分;若连续投中,该球得分为前一球得分的2倍。请回答下列问题:(1)若某同学投球情况是“11011”,则得分是________分。 (2)自定义函数fcount功能是根据计分规则计算投球得分的程序代码如下,请在划线处填入合适的代码。def fcount(data): total,temp=0,0 for i in range(len(data)): if ①________: temp=1 elif data[i]=='1': ②______ else: temp=0 total+=temp return total(3)读取数据,计算各人得分。请在划线处填入适合的代码。df1=pd.read_csv('scores.csv',converters={'投球情况':str})for i in df1.index: cj=fcount(__________ ) df1.at[i,'分数']=cj(4)统计班级平均分,根据班级平均分前5名的数据绘制柱形图,如图b所示。请在划线处填入适合的代码。df2=df1.groupby("班级",as_index=False).①______ #设置绘图参数,代码略plt.bar(x,y)#绘制柱形图方框中应填入的正确代码为②________(多选,填字母) A.dfs=df2.sort_values('分数').tail(5) x=df2["班级"] y=df2["分数"]B.dfs=df2.sort_values('分数,ascending=True)[0:5] x=dfs.index y=dfs["分数"]C.dfs=df2.sort_values('分数',ascending=False) dfs=dfs.head(5) x=dfs["班级"] y=dfs["分数"]D.dfs=df2.sort_values('分数,ascending=False)[0:5] x=dfs["班级"] y=dfs["分数"]答案 (1)6或6分 (2)①data[i]=="1" and temp==0②temp=2*temp或temp*=2 (3)df1.at[i,"投球情况"]或df1["投球情况"][1](4)①mean() ②CD解析 (1)投球情况为“11011”,得分依次为1,2,0,1,2,共计6分。(2)①data[i]为"1"表示当前投中,而temp存储上一次的情况。②得分是前一球得分的2倍。(3)自定义函数fcount计算当前行的“投球情况”单元格的得分情况,该单元格可以采用属性法、字典法和行列法共三种方法表示。(4)①统计班级平均分的函数是mean。②根据图b可知,要筛选出前5名并且按照降序排列,降序排列ascending应设置为False。3.小周要统计高二年级各班的行为规范得分情况,部分扣分数据如图a所示。(1)观察数据,发现存在重复扣分的记录,如图a第2、3行所示。现需对数据进行整理,以下操作合理的是________(单选,填字母)。 A.对班级、记录员均相同的记录去重B.对日期、关联学生、项目名称均相同的记录去重C.对关联学生、项目名称、项目扣分均相同的记录去重(2)如图a第4行“关联学生”所示,多名学生信息以分号分隔集中登记。现需要将这些关联学生信息进行拆分,每位学生各一条记录。实现拆分功能的部分Python程序如下,请在划线处填入合适的代码。import pandas as pddf=pd.read_excel("高二年级学生行规扣分明细.xlsx")i=0while i s=①______ t=0 for j in range(len(s)): if s[j]==";": df=pd.concat([df, df[i:i+1]],ignore_index=True) #将当前记录复制并添加到表末尾,concat函数用于连接两个DataFrame对象 df.at[len(df)-1,"关联学生"]=s[t:j] df.at[i,"关联学生"]=s[j+1:] ②______ i=i+1(3)该校高二年级共有16个班级,统计各班的行为规范得分(班级行为规范得分=100分-本班所有学生扣分),并绘制如图b所示的柱形图,实现该功能的部分Python程序如下,请在划线处填入合适的代码。import matplotlib.pyplot as pltpoint=df.groupby("①________",as_index=False).sum() cla=[100]*16for i in range(len(point)): m=point.at[i,"班级"] cla[m-1]-=point.at[i,"项目扣分"]x=[str(i)+"班" for i in range(1,17)]y=②________ #设置绘图参数,代码略plt.bar(x,y)plt.show()答案 (1)B (2)①df["关联学生"][i]或df.关联学生[i]或df.at[i,"关联学生"] ②t=j+1 (3)①班级 ②cla解析 (1)日期、关联学生、项目名称都相同,那么这两条记录是重复。(2)①索引为i的“关联学生”列的名称为df["关联学生"][i]。②从表达式s[t:j]来看,变量t的表示一位学生的开始索引位置,若当前位置的值为引号,则下一位学生的索引位置从j+1开始。(3)①计算每个班级的得分,因此须按班级进行分组统计。②列表cla中存储每个班级的得分。4.某单位正式员工的基本工资计算公式为:基本工资=岗位工资+薪级工资,如图a和图b,分别对应salary1.xlsx文件和salary2.xlsx文件。员工入职单位一年后转正,定岗位等级为十三级,根据学历定起始的薪级,中专2级、大专5级、本科7级、硕士11级、博士14级。转正定级后,薪级每年增加一级。为统计分析该单位员工的工资情况,编写Python程序。请回答下列问题:(1)定义岗位工资和薪级工资标准查询的两个函数。gwgz函数功能为:读取salary1.xlsx文件,根据岗位等级m,返回对应的工资标准,例如m=“十三级”,gwgz(m)=1585。函数代码如下,划线处应填入的代码为________(单选,填字母)。 A.df1.'岗位等级'[i]==mB.df1[岗位等级][i]==mC.df1['岗位等级'][i]==mD.df1[i]['岗位等级']==mimport pandas as pddef gwgz(m): df1=pd.read_excel('salary1.xlsx') for i in df1.index: if________: return df1.at[i,'工资标准']xjgz函数功能为:根据薪级等级n,返回对应的工资标准,例如n=10,xjgz(n)=661,代码略。(2)现有员工信息表info.xlsx,所有员工都已经过了实习期,如图c。统计各学历的人数和基本工资的平均值,编写Python程序。请回答下列问题:import matplotlib.pyplot as pltimport datetimedic={'中专':2,'大专':5,'本科':7,'硕士':11,'博士':14}time=datetime.date.today() #获得当前的年月日now_year=time.year #获取年份now_month=time.month #获取月份df=pd.read_excel('info.xlsx')for i in df.index: station=df.at[i,'岗位等级'] past_year=int(df.at[i,'入职年月'][:4]) past_month=int(df.at[i,'入职年月'][5:]) if now_month >=past_month: grade=now_year-past_year-1 else: grade=now_year-past_year-2 grade+=①______ df.at[i,'基本工资']=②________ #计算员工的基本工资 #对各学历的员工计算平均基本工资和统计人数df1=df.groupby('学历',as_index=False).agg({'基本工资':'mean','姓名':'count'}) #修改列名df2=df1.rename(columns={'基本工资':'平均工资',"姓名":"人数"}) #图表对象初始化,代码略plt.bar(df2.学历,df2.平均工资,label="平均工资") #绘制柱形图plt.plot(df2.学历,③________,label="人数") #绘制线形图plt.legend()plt.show()(3)目前该单位平均工资为3867.33元,由图d可知,学历为________的员工,他们的平均工资与公司平均工资相差最大。 答案 (1)C (2)①dic[df.at[i,'学历']] ②gwgz(station)+xjgz(grade) ③df2.人数 (3)博士解析 本题考查pandas数据处理。(1)根据岗位等级m,返回对应的工资标准。(2)①grade表示工作年限,其值为参加工作时间加上学历时间(读大学的年数)。②计算员工的基本工资,基本工资=岗位工资+薪级工资。③线性图的纵轴为人数。(3)略。5.某同学收集了部分城市2022年4月每天24小时空气质量数据,按日分别保存在csv文件中,部分文件如图a所示。数据格式如图b所示。请回答下列问题:图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.AQI C.g.AQID.g[g.类型=='AQI'](2)统计本月各城市空气质量最长连续优、良的天数(按照环境空气质量标准,空气污染指数 AQI≤50为优级,AQI≤100 为良好),代码如下,绘制的图表如图 c 所示。请在划线处填入合适的代码。图cimport 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)p1t.figure(figsize=(12,4))x= ③______y=daymaxplt.bar(x, y)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是城市名称列表。6.小明是智能门禁系统的管理员,他导出某天学生晚自习后回寝室的刷卡数据到文件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对象中学生编号、班级等列。 展开更多...... 收起↑ 资源列表 课时13 利用pandas进行数据统计(二).docx 课时13 利用pandas进行数据统计(二).pptx