必修一 数据与计算 课时13 利用pandas进行数据统计(二)(课件 教案)2027届高中通用技术一轮复习

资源下载
  1. 二一教育资源

必修一 数据与计算 课时13 利用pandas进行数据统计(二)(课件 教案)2027届高中通用技术一轮复习

资源简介

课时13 利用pandas进行数据统计(二)
【学业要求】
知识点 学业水平等级
1.掌握DataFrame对象数据集的遍历。 4
2.掌握编写程序代码,并利用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 pd
import 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 pd
import matplotlib.pyplot as plt
df=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 pd
import 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,"得分"]=mark
a=df1.groupby("选修课名称",as_index=False)["得分"].②   
for i in range(0,len(a)):
  a.at[i,"得分"]+=100
(3)根据满意度进行降序排序,绘制如图c所示的柱形图,实现该功能的部分Python程序如下:
图c
a=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 pd
import matplotlib.pyplot as plt
df = pd.read_excel('data.xlsx')
tp = input('请输入疾病类型:')
df1 = ①     #筛选tp疾病的数据
count = [0] * 4
for 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] += 1
x = ['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 pd
import matplotlib.pyplot as plt
area = {"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 = True
B."公共服务惠民指数", ascending = False
C.dfg["公共服务惠民指数"], ascending = True
D.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 65
1 饭菜价格 1059 419 556 84
2 菜品花样 1059 485 513 61
3 餐厅环境 1059 732 321 6
4 服务质量 1059 718 312 29
5 餐厅整体 1059 377 554 128
图b
为统计分析每个调查项目不同选项的人数及不满意率,编写Python程序。请回答下列问题:
(1)统计每一项调查内容的总票数、满意、一般及不满意人数,程序运行结果如图b所示,
import pandas as pd
import 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所示,请在划线处填入合适的代码。
图c
df2["不满意率(%)"]=①    
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 满意 482
1 一般 512
2 不满意 65
②dfc对象是每个项目colname的满意、一般和不满意3个项目的投票数,遍历该对象,name是每个选项的名称,因此需将每个选项的值添加到字典中去。(2)根据字典data创建了一个df2对象,①将在df2对象中新增"不满意率(%)"列,其值计算方法为不满意选项数除以总得票数,在图表中可知,其值大于1,因此需乘以100。②创建图表的x轴为各个调查项目。
1.小红收集了某平台的销售数据,部分数据如图a所示。
为了在销售利润最高的“商品品类”的客户中,统计出不同年龄段的人数,她编写Python程序如下。请回答下列问题:
(1)计算订单“销售利润”的规则为:销售利润=销售单价×销售数-进货总价。实现该计算的Python程序如下,请在划线处填入合适的代码。
import pandas as pd
import matplotlib.pyplot as plt
df=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程序如下,请在划线处填入合适的代码。
图b
nums=[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) -j
xlabel = ["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 pd
df=pd.read_excel("高二年级学生行规扣分明细.xlsx")
i=0
while 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 plt
point=df.groupby("①    ",as_index=False).sum()
cla=[100]*16
for 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]==m
B.df1[岗位等级][i]==m
C.df1['岗位等级'][i]==m
D.df1[i]['岗位等级']==m
import pandas as pd
def 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 plt
import datetime
dic={'中专':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.AQI
D.g[g.类型=='AQI']
(2)统计本月各城市空气质量最长连续优、良的天数(按照环境空气质量标准,空气污染指数 AQI≤50为优级,AQI≤100 为良好),代码如下,绘制的图表如图 c 所示。请在划线处填入合适的代码。
图c
import pandas as pd
import matplot1ib.pyplot as plt
n=10 #城市个数
count=[0]*n
daymax=[0]*n
for 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=daymax
plt.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 pd
import matplotlib.pyplot as plt
df=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对象数据集的遍历。 4
2.掌握编写程序代码,并利用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 pd
import 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 pd
import matplotlib.pyplot as plt
df=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 pd
import 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,"得分"]=mark
a=df1.groupby("选修课名称",as_index=False)["得分"].②______
for i in range(0,len(a)):
  a.at[i,"得分"]+=100
(3)根据满意度进行降序排序,绘制如图c所示的柱形图,实现该功能的部分Python程序如下:
图c
a=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.列名就可以表示该列所有的数据的集合,可以运用函数计算一个集合对象的记录数量、总和、平均值和最值(最大值或最小值)。通过筛选找到符合处理条件的数据(子集)集合,再对集合进行求和等计算。通过分组,将某列相同字段值的记录组合在一起,形成一个个的分组,再分别统计各个分组的数量、和、平均值和最值。
当堂检测
3
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 pd
import matplotlib.pyplot as plt
df = pd.read_excel('data.xlsx')
tp = input('请输入疾病类型:')
df1 = ①________ #筛选tp疾病的数据
count = [0] * 4
for 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] += 1
x = ['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 pd
import matplotlib.pyplot as plt
area = {"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 = True
B."公共服务惠民指数", ascending = False
C.dfg["公共服务惠民指数"], ascending = True
D.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 65
1 饭菜价格 1059 419 556 84
2 菜品花样 1059 485 513 61
3 餐厅环境 1059 732 321 6
4 服务质量 1059 718 312 29
5 餐厅整体 1059 377 554 128
图b
为统计分析每个调查项目不同选项的人数及不满意率,编写Python程序。请回答下列问题:
(1)统计每一项调查内容的总票数、满意、一般及不满意人数,程序运行结果如图b所示,
import pandas as pd
import 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所示,请在划线处填入合适的代码。
图c
df2["不满意率(%)"]=①________
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 满意 482
1 一般 512
2 不满意 65
②dfc对象是每个项目colname的满意、一般和不满意3个项目的投票数,遍历该对象,name是每个选项的名称,因此需将每个选项的值添加到字典中去。(2)根据字典data创建了一个df2对象,①将在df2对象中新增"不满意率(%)"列,其值计算方法为不满意选项数除以总得票数,在图表中可知,其值大于1,因此需乘以100。②创建图表的x轴为各个调查项目。
课时作业
4
1.小红收集了某平台的销售数据,部分数据如图a所示。
为了在销售利润最高的“商品品类”的客户中,统计出不同年龄段的人数,她编写Python程序如下。请回答下列问题:
(1)计算订单“销售利润”的规则为:销售利润=销售单价×销售数-进货总价。实现该计算的Python程序如下,请在划线处填入合适的代码。
import pandas as pd
import matplotlib.pyplot as plt
df=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程序如下,请在划线处填入合适的代码。
图b
nums=[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) -j
xlabel = ["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 pd
df=pd.read_excel("高二年级学生行规扣分明细.xlsx")
i=0
while 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 plt
point=df.groupby("①________",as_index=False).sum()
cla=[100]*16
for 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]==m
B.df1[岗位等级][i]==m
C.df1['岗位等级'][i]==m
D.df1[i]['岗位等级']==m
import pandas as pd
def 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 plt
import datetime
dic={'中专':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.AQI
D.g[g.类型=='AQI']
(2)统计本月各城市空气质量最长连续优、良的天数(按照环境空气质量标准,空气污染指数 AQI≤50为优级,AQI≤100 为良好),代码如下,绘制的图表如图 c 所示。请在划线处填入合适的代码。
图c
import pandas as pd
import matplot1ib.pyplot as plt
n=10 #城市个数
count=[0]*n
daymax=[0]*n
for 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=daymax
plt.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 pd
import matplotlib.pyplot as plt
df=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对象中学生编号、班级等列。

展开更多......

收起↑

资源列表