内容正文:
高效作业17[第17课 编程处理数据【A级 新教材落实与巩固】
1.某饭馆2024年2月的订餐数据保存在文件“ddsl.xlsx”中,部分数据如图1所示。编写Python程序来统计2月订餐最多的3种菜品,并使用图表呈现统计结果(并列前3的菜品均显示)。
图1
请回答下列问题。
(1)由图2可知,该饭馆有__3__个菜品并列第三。
图2
实现上述功能的Python程序段如下:
import pandas as pd
df=pd.read_excel(”ddsl.xlsx”) #读取文件中的数据
df=df.drop([”日期”,”订单号”,”单价”,”金额”],axis=1) #删除列
dfg=df.groupby(”①__菜品__”,as_index=False).sum() #分组求和
#升序排序
dfg=②________
plt.bar(dfs[”菜品”],dfs[”份数”])
# 设置图表样式,显示图表,代码略
(2)请在程序段中横线①处填入合适的代码。
(3)程序段中加框处应填入的代码为__D__(单选,填字母)。
A.dfs=df.sort_values(”份数”,ascending=True)
B.dfs=df.sort_values(”份数”,ascending=False)
C.dfs=dfg.sort_values(”份数”,ascending=True)
D.dfs=dfg.sort_values(”份数”,ascending=False)
(4)下列选项能实现程序段中横线②处功能的有__CD__(多选,填字母)。
A.dfs[0:3]
B.dfs.head()
C.dfs[dfs.份数>=dfs]”份数”][2]]
D.dfs[dfs.份数>=dfs.at[2,”份数”]]
【解析】 (1)由图2可知,有3个并列第三。
(2)根据题干要求“统计2月订餐最多的3种菜品”,结合图2与语句“plt.bar(dfs[”菜品”],dfs[”份数”])”可知,分组依据是“菜品”。
(3)根据图2可知是对分组结果按份数进行降序排序,分组后的对象名为dfg,选项D正确。
(4)要求显示订餐最多的3种菜品,并列前三的菜品均显示,选项A、B只能有3种,没有考虑并列问题,选项C、D正确。
2.小杨妈妈的生日快到了,他存了500元,想从性价比的角度选出最合适的礼物送给他的妈妈。他收集了适合送给妈妈的礼物清单,并存储在Excel表格中。请回答下列问题。
(1)整理好的礼物清单(“gifts.xlsx”)如图1所示,且性价比已计算。在计算每个商品的性价比时,可以先在E2单元格中输入公式__=G2/C2*100__,然后用自动填充功能完成其他单元格的计算。(提示:性价比=性能分值/价格×100)
图1
图2
(2)下列Python程序用于统计图1中价格不超过500元的性价比最高的10种商品,并绘制出柱形图,如图2所示。请在横线处填入合适的代码。
import pandas as pd
import matplotlib.pyplot as plt
from pylab import mpl
#设置中文显示
mpl.rcParams[”font.sans-serif”]=[”SimHei”]
mpl.rcParams[”axes.unicode_minus”]=False
df=pd.read_excel(”gifts.xlsx”)
df=①__df.drop(”产品参数”,axis=1)__#删除“产品参数”列数据,通过axis=0/1确定行列
df1=df[df[”价格”]<=500]
df2=__②df1.sort_values(”性价比”,ascending=False).head(10)或其他等价答案__
#将df1按“性价比”降序排序后取前10个,ascending=True表示升序
df2.index=df2[”商品编号”]
#根据df2中的数据绘制柱形图
plt.title(”性价比最高的10种商品”,fontsize=16)
#设置图表标题和标题文字大小
plt.xlabel(”商品编号”,fontsize=12)
plt.ylabel(”性价比”,fontsize=12)
plt.xticks(rotation=30,fontsize=12)#设置X轴标签旋转角度和文字大小
plt.show()
(3)要绘制如图2所示的柱形图,第(2)题程序中加框处应填入的代码为__BD__(多选,填字母)。
A.plt.bar()
B.plt.bar(df2[”商品编号”],df2[”性价比”])
C.df2[”性价比”].plot(df2[”商品编号”])
D.df2[”性价比”].plot(kind=”bar”)
【解析】 (1)由提示(性价比=性能分值/价格×100)可知。
(2)①删除“产品参数”列数据,使用drop()函数,需要指明列名,及axis设置为1。
②排序使用sort_values()函数,ascending=False表示降序,使用head(10)取前10项。
(3)绘制柱形图采用bar()函数。
3.小胡从网站上收集了某年浙江省各地市气象台发布的预警数据,数据集格式如图所示。
请回答下列问题。
(1)为分析各气象台的预警数据,小胡编写了如下Python程序。若要了解该年暴雨预警次数超过15次的气象台情况,请在横线处写出两种实现方式:①__①print(df[df[”暴雨”]>15])__;② __print(df[df.暴雨>15])__。
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_csv('data_weather.csv')
________________
(2)若要了解该年没有出现的极端天气的情况,并把这些天气预警数据列从数据表中去除,请在横线处填入合适的代码。
for i in df.columns[2:]:
if__df[i].sum()==0__:
df=df.drop(i,axis=1) #删除指定列
(3)若要做一个该年浙江省各地市台风天气的分析汇报,针对各地市的台风发生次数进行分析比较,小胡添加如下程序段:
df2=df.groupby('市区',as_index=False).sum()
plt.figure(figsize=(10,5))
________________
plt.xlabel('市区')
plt.ylabel('台风预警次数')
plt.title('某年各地市台风预警情况')
plt.show()
程序段中横线处应填入的代码为__A__(单选,填字母)。
A.plt.bar(df2.市区,df2.台风)
B.plt.bar(df2.index,df2.台风)
C.plt.plot(df2.columns[:],df2.台风)
D.plt.plot(df2.index,df2.台风)
【解析】 (1)对象df的暴雨列进行条件检索操作有①字典法:对象名['列标题'];②属性法:对象名.列标题。
(2)用sum()函数进行求和,列索引从0开始,天气情况从索引2开始求和,如果和为0,则删除相关列。
(3)需要比较不同地市的台风天气情况,使用bar()函数绘制柱形图比较适合,df2.index按行输出,选项A正确。
4.2024·龙泉一中检测小明收集了本周信息技术学科学习评价的数据,如图1所示。
图1
请回答下列问题。
(1)观察图1后,小明做了如下操作,其中属于数据整理的是__ABD__(多选,填字母)。
A.删除重复行第五行
B.验证并修改D2 单元格的数据
C.通过公式计算全班的平均分
D.重新设置C3 单元格格式
(2)为了分析每个组的平均分,小明设计了如下Python 程序段:
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel(”成绩表.xlsx”)
________________
print(df1)
程序段中横线处应填入的代码为__C__(单选,填字母)。
A.df1=df[”小组”].mean()
B.df1=df.mean()
C.df1=df.groupby(”小组”,as_index=False).mean()
D.df1=df.groupby(”平均分”,as_index=False).mean()
(3)利用Python 程序绘制指定小组的各小题得分率图表,如图2所示,请在横线处填入合适的代码。
图2
num=int(input(”请输入小组: ”))
plt.figure(figsize=(10,5))
list1=[]
for i in range(12):
s=”题”+str(i+1)
list1.append(df1.at[num-1,s]/2*100)
list2=list(range(1,13))
plt.__bar(list2,list1)__
plt.title(str(num)+”group”)
plt.xlabel(”question number”)
plt.ylabel(”correct rate”)
plt.show()
【解析】 (1)通过公式计算全班平均分,不属于数据整理。
(2)按小组进行分组,选项C正确。
(3)绘制柱形图使用bar()函数,list1为各小组平均分,list2为小组编号。
5.2024·教改共同体联盟检测小明收集了超市2023 年1 月的线上订单数据,并将其存储在“超市销售数据.xlsx”中,部分界面如图1所示。
图1
请回答下列问题。
(1)当前原始数据中存在哪些需要更改的数据问题?应如何修改?(写出一种即可)
问题一:“单位”列中的单位内容没有统一, 有些是“KG”,有些是“千克”。
做法:将所有的“KG”都更改成“千克”。
问题二:部分数据缺失, 例如G8单元格、F15单元格等。
做法:按照内容核实后补齐。
问题三:部分数据异常,例如I11单元格,商品单价为99999。
做法:按照内容核实后进行更改。 。
(2)当前Excel表中需要计算订单中每种商品的销售金额(销售金额=销售数量×商品单价),在J2 单元格中输入公式__=H2*I2____,并自动填充到下方的单元格中。
(3)小明想要求出最畅销的10种洗化类商品,运用Python 处理数据后的效果如图2所示。
图2
部分Python代码如下,请在横线处填入合适的代码。
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel(”超市销售数据.xlsx”)
plt.re(”font”,**{”family”:”SimHei”}) #设置字体
df=df[df[”商品类别”]==”洗化”] #筛选出洗化类商品
g=df.groupby(”商品名称”).sum()
__g=g.sort_values(”销售数量”,__ascending=False)[0:10]plt.bar(g.index,g[”销售数量”])或__g=g.sort_values(”销售数量”,ascending=False).head(10)plt.bar(g.index,g.销售数量)或其他等价答案__#
plt.title(”最畅销的10种洗化类商品”)
plt.xlabel(”洗化类商品”)
plt.ylabel(”销售数量”)
plt.show()
【解析】 (1)主要考查数据整理的内容。
(2)用公式计算时, 需要注意等号及乘号的书写。
(3)根据题意需求出最畅销的10种洗化类商品, 因此在筛选出洗化类商品后,需要按照销售数量进行降序排序,同时绘制柱形图。
6.小蓝利用Excel收集了某年世界杯小组赛各支球队的相关数据,并保存在“世界杯.xlsx”文件中,如图1所示。然后他利用pandas模块进行数据处理,分析小组赛中各球队的表现。(提示:世界杯小组赛共分成8个小组,每个小组4支球队,组内各队之间进行1场比赛,每支球队共比赛3场)
图1
请回答下列问题。
(1)小蓝在处理数据前,首先进行了数据整理,则下列操作正确的是__AD__(多选,填字母)。
A.E4单元格中的数据存在逻辑错误,需要改成3
B.第7行的数据与第8行的数据重复,直接删除其中一行即可
C.英格兰队的所在行存在数据缺失,故无法确定具体的数值
D.阿根廷所在小组的组别格式不一致,应当将其改成C
(2)小蓝利用pandas模块处理图1中的表格数据,其中部分Python程序代码如下。在处理数据的过程中,小蓝提出了以下3项要求。请根据他的要求在横线处填入合适的代码。
①首先计算各球队的小组赛积分。积分计算规则为:胜一场得3分,平局得1分,负一场得0分。
②然后对各球队进行小组排名。小组排名规则为: 按积分降序排序。
③最后统计各小组的平均进球数,并绘制成如图2所示的图表。
图2
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimSun']
#图表显示中文
df=pd.read_excel('世界杯.xlsx')
df['积分']=①__df.胜*3+df.平__或其他等价答案__
dfrank=df.sort_values(②__'积分'__或by='积分'____,ascending=False)
print(dfrank)
df2=df.groupby('组别').mean()
plt.bar(③__df2.index,df2.进球__或其他等价答案__,label='平均进球')
plt.legend()
plt.show()
(3)小蓝要从df中筛选出积分至少为4分且进球多于失球的球队,下列操作可行的是__BC__(多选,填字母)。
A.df.净胜球>0 and df.积分>=4
B.df[df['净胜球']>0][df['积分']>=4]
C.df[(df.净胜球>0)&(df.积分>=4)]
D.df[df['净胜球']>0]&df[df['积分']>=4]
【解析】 (1)同小组比赛3场,胜和平都是0场,由此可以看出卡塔尔队负为3 场,选项A正确;重复数据要在审查的基础上合并后删除,选项B错误;美国队平2 场,威尔士平1 场,伊朗1 胜2 负,说明美国对英格兰1 场为平,则可确定英格兰1 平0 负,选项C错误;选项D正确。
(2)由题干的积分规则,可知①空填:df.胜*3+df.平。
②空按积分降序排序,填:'积分'或by='积分'。
③观察图表,可知数组源应来自df2,由于df 按组别进行分组求平均进球时,默认分组字段为索引,因此图表的X 轴数据来自df2.index,Y 轴为df2.进球,填:df2.index,df2.进球。
(3)DataFrame 中进行多条件筛选时,条件之间可以用“&”连接,表示“且”的关系,选项C 正确;选项B 先用df[df['净胜球']>0]操作筛选出所有进球多于失球的球队,得到一个DataFrame 对象,再把这个对象看作整体,使用[df['积分']>=4]操作,就能够得到同时满足这两个条件的球队。故选项B 正确,选项A、D 错误。
7.2024·宁波中学检测 小林在制订出游计划前收集了浙江省内各“A级”景区数据,部分数据如图1所示。为了对比各地市“AAAA级”及以上景区的数量,小林编写了如下 Python 程序。请回答下列问题。
图1
(1)观察图1中“等级”列数据,该列数据存在的问题是__D__(单选,填字母)。
A.数据缺失 B.数据重复
C.逻辑错误 D.格式不一致
(2)小林先对数据进行整理,然后统计各地市“AAAA级”及以上景区的数量并按数量降序排序,程序如下,请在横线处填入合适的代码。
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel(”浙江“A级”景区.xlsx”)
df=df.drop([”电话”,”景区编码”],①__axis=1__) # 删除不必要的列
for row in range(len(df)): #整理“等级”列数据
grade=df.at[row,”等级”]
if ”1”<=grade[0]<=”9”:
df.at[row,”等级”]=”A” *int(grade[0])
df2=df[②__df[”等级”]或df.等级__>=”AAAA”]
dfg=df2.groupby(”地市”).count()
dfg=dfg.rename(columns={”等级”:”数量”})
# 重命名列名称
dfg.③__sort_values__(”数量”,ascending=False,inplace=True)
(3)小林将排序后的结果绘制成柱形图,结果如图2所示。
plt.figure(figsize=(8,4))
plt.rcParams[”font.sans-serif”]=[”SimHei”,”FangSong”]
plt.title(”浙江“AAAA级”及以上景区的数量统计图”)
for i in range(len(dfg)):
plt.text(i,dfg[”数量”][i]+1,dfg[”数量”][i])
plt.xlabel(”地市名称”)
plt.ylabel(”数量”)
plt.legend()
plt.show()
图2
为实现上述功能,则上述程序中加框处可选的代码为__D__(单选,填字母)。
A.plt.plot(dfg[”地市”],dfg[”数量”],color=”orange”, label=”景区数量”)
B.plt.bar(dfg[”地市”],dfg[”数量”],color=”orange”)
C.plt.plot(dfg.index,dfg[”数量”],color=”orange”)
D.plt.bar(dfg.index,dfg[”数量”],color=”orange”,label=”景区数量”)
【解析】 (1)数据缺失是E 列存在的问题,数据重复是有多余的数据,逻辑错误是指数据不符合实际或不符合常识,B 列数据主要是“4A”和“AAAA”两种数据格式不一致的问题。选项D正确。
(2)第①空,由注释可知需要删除列数据,而drop()函数默认是删除行,因此这里需要指定axis=1的参数。表示“电话”“景区编码”是列名称。第②空需要根据此数据进行数据筛选,答案是df[”等级”]或df.等级。按“地市”进行了分组,统计了相同数据行各列数据的行数,把“等级”列的列名称重命名成了“数量”。而题目要求排序,因此第③空需要调用sort_values()函数进行排序。答案是sort_values。
(3)观察图表可知,图表类型是柱形图bar()而不是线形图plot(),因此可以排除选项A、C。由于第(2)题代码的第11 行,数据分组后“地市”一列数据已成为了索引,同时可观察到图表的横坐标是各地市的名称,因此bar()函数的第一个参数应是dfg.index,而不能是dfg[”地市”]。故选项D正确。同时,选项D由label 参数指明了图表的图例中的文本,而选项B没有。
【B级 素养形成与评价】
8.小明采集到了某市的共享单车在2023 年5 月10 日至24 日两周之内的使用情况的数据集,其中包括6 万多条出行记录,如图1 所示。
图1
请回答下列问题。
(1)小明编写Python程序来分析共享单车0 时~23 时骑行订单数分布情况,运行以下程序后的结果如图2 所示,请在横线处填入合适的代码。
图2
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams[”font.sans-serif”]=[”SimHei”]
df=pd.read_csv(”data.csv”)
df=df.drop([”用户ID”,”车辆ID”,”车辆类型”],axis=1) #删除无关的数据列
n=①__len(df)__
hour=[] #标记0 时~23 时(时,忽略分和秒),如18:46:05,即为18 时
for row in range(n):
start_time=②__df.at[row,”骑行起始时间”]__
hour.append(int(start_time[0:2]))
df[”0 时~23 时”]=hour #新增“0 时~23 时”列
result=df.groupby(”0 时~23 时”).count()
plt.title(”共享单车0 时~23时骑行订单数分布情况”)
plt.bar(③__result.index__,result.订单号)
plt.xticks(result.index)
plt.xlabel(”时”)
plt.ylabel(”订单数量”)
plt.show()
(2)小明想进一步分析共享单车周末与工作日0时~23 时骑行订单数分布情况。已知2023 年5 月6日和7 日为周末,小明编写以下程序,实现新增“周末”列,周末值为1,工作日值为0,运行程序后的结果如图3 所示,请在横线处填入合适的代码。
图3 图4
isWeekend=[] #标记是否为周末
for row in range(n):
start_date=df.at[row,”骑行起始日期”]
d=①__int(start_date[-2:])__或其他等价答案__
if (d+1)%7==0 or d%7==0: #根据骑行起始日期来判断是否为周末
②__isWeekend.append(1)__
else:
isWeekend.append(0)
df[”周末”]=isWeekend #新增“周末”列
print(df[[”骑行起始日期”,”周末”]].head(15))
(3)小明绘制了共享单车周末与工作日0时~23时骑行订单数分布情况的柱形图,如图4 所示。请结合柱形图,分析共享单车周末与工作日0 时~23时骑行订单数的分布情况,写出1条结论: ①23时~5时这段时间,周末和工作日基本一致,骑行订单数极少,说明使用单车出行的人数极少。
②工作日,存在骑行早晚高峰,在7时~8时和17时~18时的上、下班时段。(11时~13时段,出现局部午高峰。)
周末骑行的时间分布相对平缓,没有明显的早晚高峰现象。
③周末整体骑行订单数明显少于工作日的骑行订单数。 。
【解析】 (1)①根据range(n)可知,n 为数据对象df 中记录的数量,因此本空填写len(df),也可以填写df.订单号.count()或df[”订单号”].count()。
②同样根据range(n)可以得到row 的取值范围为0~n-1,即数据对象df 的行号,start_time 为每一行,对应的骑行起始时间,故本空填写df.at[row,”骑行起始时间”],也可以填写df[”骑行起始时间”][row]。
③本空所在代码实现绘制柱形图,需填横坐标,即“0 时~23 时”,由于分组时as_index 参数省略,分组对象“0 时~23 时”会作为索引存在结果result 中,本空填写result.index。
(2)①start_date 为每一行对应的骑行起始日期,d 为骑行起始时间中的最后两位,结合条件中d%7 可知d的数据类型应为整型,因此本空填写int(start_date[-2:])。
②由于6日和7 日为周末,当条件成立时表示是周末,周末值为1,故本空应填写isWeekend.append(1)。
9.小明收集了某年全国各省份人均消费的相关数据,部分数据如图1 所示。为了统计分析各省份的消费情况,小明编写了如下Python 程序。请回答下列问题。
图1
(1)统计各区域超过全国总消费平均值的省份数量,请在横线处填入合适的代码。
import pandas as pd
plt.rcParams[”font.sans——serif”]=[”SimHei”]
df=pd.read_excel(”xiaofei.xlsx”)
df[①__”总消费”____]=df.sum(axis=1)
avg=df.总消费.mean()
dic={”华北”:0,”东北”:0,”华东”:0,”华中”:0,”华南”:0,”西南”:0,”西北”:0}
for i in ②__range(len(df))或range(0,len(df))__:
if df.总消费[i]>=avg:
dic[③__df.区域[i]或df[”区域”][i]____]+=1
(2)若要筛选出总消费最高的5 个省份,下列程序中横线处应填入的代码为__ABD__(多选,填字母)。
res=________
print(”总消费最高的5 个省份为:
”,list(res.省份))
A.df.sort_values(”总消费”,ascending=False).head(5)
B.df.sort_values(”总消费”).tail(5)
C.df.sort_values(”总消费”)[0:5]
D.df.sort_values(”总消费”,ascending=False)[0:5]
(3)统计并绘制该年全国各区域总消费平均值比较图,如图2 所示。部分Python 程序如下,请在横线处填入合适的代码。
import matplotlib.pyplot as plt
df1=df.groupby(”区域”,as_index=True).mean()
plt.bar(__df1.index__,df1.总消费)
plt.title(”全国各区域总消费平均值比较图”)
plt.ylim(20000,36000)
plt.show()
图2
【解析】 (1)①由题意“统计各区域超过全国总消费平均值的省份数量”,结合下一句avg=df.总消费.mean()可知,①处是求“总消费”,即对所有数据按行求和。①处填:”总消费”。
②处所在的循环遍历df 对象,判断每个总消费值是否超过ave 并做相应处理。②处填:range(len(df))或range(0,len(df))。
③处以地区为键进行统计,填:df.区域[i]或df[”区域”][i]。
(2)消费最高的5 个省份,要么按总消费降序排序,选前5 个,或者按总消费升序排序,选后5,选项A、B、D 正确。
(3)从图表可以看出,X 轴数据来自于“区域”列。注意对df 分组时,设置了as_index=True 参数,即“区域”在分组后的df1 中成为了行索引,在引用其值时,要用df1.index。
10.采集某市2023年1月~10月空气质量数据如图1所示, 空气质量指数及指数等级信息如图2所示。
图1
空气质量指数
指数等级
0~50
优
51~100
良
101~150
轻度污染
151~200
中度污染
201~300
重度污染
>300
严重污染
图2
请回答下列问题。
(1)主程序如下,用于读取Excel数据文件, 根据输入的月份查询该月的空气质量指数数据, 进行处理后将其可视化,程序运行界面如图3所示。请在横线处填入合适的代码。
图3
import pandas as pd
import matplotlib.pyplot as pit
df=pd.read_excel(”hz2023.xlsx”)
zhengli() #整理数据
while True:
m=int(input(”请输入月份(1~10),输入0 结束: ”))
if m==0:
break
elif __m__in__range(0,11)__或__0<m<11__或1<=m<=10__:
fenxi(m)
else:
print(”输入有误! ”)
(2)编写整理数据函数zhengli(),根据空气质量指数来设置指数等级。请在横线处填入合适的代码。
def zhengli(): #整理数据
df[”Month”]=df[”日期”].dt.month #取出月份, dtype: int64
df[”Day”]=df[”日期”].dt.day
df[”等级”]=”优”
for i in df.index:
t=df[”AQI”][i]
if t>300:
df[”等级”][i]=”严重污染”
elif t>200:
df[”等级”][i]=”重度污染”
elif t>150:
df[”等级”][i]=”中度污染”
elif t>100:
df[”等级”][i]=”轻度污染”
__elif__t>50__:
df[”等级”][i]=”良”
(3)编写分析数据函数fenxi(), 根据给定月份, 分析该月的数据并可视化, 可视化结果如图4所示。请在横线处填入合适的代码。
图4
def fenxi(m): #分析m月数据
df_m=①__df[df.Month==m]__或df[df[”Month”]==m]__#查询对应月份数据
df_m=df_m.sort_values(”Day”)
df_g=df_m[”Day”].groupby(df_m[”等级”]).count()
print(df_g)
x,y=②__df_m.Day,df_m.AQI__
pit.Figure()
plt.xlabel(”Day”)
plt.ylabel(”AQI”)
pit.plot(x,y)#制作图表
pit.show()
【解析】 (1)程序支持查询1~10月的空气质量指数,输入月份在此范围内可正常查询。
(2)函数zhengli()实现的功能是根据AQI的值按照题干图2中的评级标准对空气质量进行评级, 表中51~100为良。当程序执行横线处的代码时,t<=100,故只需t>50。
(3)函数fenxi()实现对数据的可视化,绘制m月份的AQI 折线图。①空需要从所有数据中筛选出m月份的数据,故应填df[df.Month==m]或 df[df[”Month”]==m]。②空根据生成的折线图可以判断X轴表示m月的每一天,Y轴表示对应的AQI的值。
11.针对选考2024·玉环中学检测为了解不同班级间的信息技术的成绩差异,王老师搜集了某次周练的选择题部分数据,如图1所示。
(1)观察图1中的数据,下列操作中属于数据整理的是__AC__(多选,填字母)。
A.对重复的数据可进行合并处理
B.通过公式计算全班平均分
C.修正A78单元格的数据
D.若有缺失的数据,可采用随意数据来填充
图1
图2
(2)利用Python程序绘制图表,如图2所示,请在横线处填入合适的代码。
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans——serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
df=pd.read_excel(”答题数据表.xlsx”)
ans=df.values[0]
df=df.drop(0) #删除df中第0行数据
for record in df.values: #遍历df中每一行的记录
for j in range(3,len(record)):
if ①__record[j]==ans[j]__:
record[j]=100
else:
record[j]=0
# 调整对应区域的数据格式
for col in df.columns[3:]:
df[col]=df[col].astype(str).astype(int)
df1=df.groupby(”班级”)
data_avg=②__df1.mean()__或__df1.sum()/df1.count()__ #获取每个班级的各小题平均得分率
plt.figure(figsize=(10,5))
list1=[] #13班数据
for i in range(len(record)-4):
list1.append(data_avg.at['13班','T'+str(i+1)])
list2=[] #7班数据
for i in range(len(record)-4):
list2.append(data_avg.at['7班','T'+str(i+1)])
plt.plot(range(1,len(record)-3),list1,label=”13班”)
plt.plot(range(1,len(record)-3),list2,label=”7班”)
plt.title(”班级各题准确率对比图”)
plt.xlabel(”题目编号”)
plt.ylabel(”准确率”)
③__plt.legend()__ #显示图例
plt.show()
【解析】 (1)根据Excel 数据表中的数据可知,无法通过公式计算全班平均分,故选项B 错误;若有缺失的数据,通常采用平均值、中间值或概率统计值来填充缺失值,故选项D 错误。
(2)df 对象存放的是“答题数据表.xlsx” 中的数据,DataFrame 默认把Excel 表格中的第一行变成了标题行,ans=df.values[0]中的ans 中存放的是客观题答案, j遍历的是每个学生的每个答案, 故①record[j]==ans[j] 表示学生该题的答案与正确答案一致,该题所得100,此处record[j]=100是为了后面计算平均值;②处要填的是获取每个班级的各小题平均得分率,mean()函数可以实现;③处要显示图例,故答案为plt.legend()。
12.小原爸爸负责接小原放学。一段时间内,小原爸爸将每天接小原时的堵车时间和天气情况记录在文件“data.xlsx”中,其中堵车时间的单位为分钟,如图1 所示,并通过Python 语言编程制作了图表,如图2 所示。
图1 图2
(1)分析图2可知,天气情况与堵车时间__A__(单选,填字母:A.有;B.没有)一定的关系。
(2)部分程序代码如下,请在横线处填入合适的代码。
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans——serif']=['SimHei'] #用来正常显示中文标签
df=pd.read_excel(”data.xlsx”) #读取Excel 文件中的数据
df=df.groupby(”天气情况”,as_index=True).①__mean()__ #按“天气情况”分组求平均堵车时间
df=df.sort_values(”堵车时间”,ascending=②__False__) #按“堵车时间”进行降序排序
x=③__df.index__
y=df[”堵车时间”]
plt.title(”不同天气情况的平均堵车时间分析”)
#设置图表标题
plt.bar(x,y) #绘制柱形图
plt.show()
【解析】 (1)从题干中的图2 可知,堵车的时间与雨势大小相关,故选项A正确。
(2)由提示可知,分组后要求平均堵车时间,①处填mean();降序排序的参数为ascending=False,②处填False。
观察图2 可知X 轴数据为“天气情况” ,而df 已按“天气情况”进行了分组并设置为了索引(参数:as_index=True),故③处填df.index,不能填df[”天气情况”]。
13.针对选考2024·普陀中学检测某校对网上阅卷的结果进行分析处理,阅卷结果的原始数据存储在“score.xlsx”文件中,如图1所示。现用Python程序对数据进行处理,请回答下列问题。
图1
(1)为对比分析各班的平均分,该校使用如下程序绘制了柱形图,如图2所示。请在横线处填入合适的代码。
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel(”score.xlsx”)
plt.rcParams[”font.sans——serif”]=[”KaiTi”,”SimHei'] # 设置字体,以显示中文
df1=df.groupby(”班级”,as_index=True).mean()
plt.bar(__df1.index,__df1.总分__或df1.index,__df1[”总分”]__)
plt.ylim(30,42)
plt.xlabel(”班级”)
plt.title(”班级平均分对比图”)
plt.show()
图2
图3
(2)为分析学生每个选择题的答题情况,该校使用如下程序输出了每题各个选项(A、B、C、D)的占比,结果如图3所示,请在横线处填入合适的代码。
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel(”score.xlsx”)
number=①__len(df.columns)-4__# 存储选择题题目总数,选择题从第5列开始到最后一列为止
n=len(df) # n表示总人数
print(”题号A B C D”)
for i in range(number):
print('(',i+1,')',end=' ')
for option in 'ABCD':
dfx=df[df['单选'+str(i+1)]==②__option__]
rate=100 *dfx['姓名'].③__count()__/n
print(round(rate,2),end='%')
print() #换行
【解析】 (1)由图2中的柱形图可知,横轴数据是各个班级,纵轴数据是各班对应的平均分值。而数据框df1中的数据就是按班级分类处理过的数据:班级相同的所有人都合成了一行,且求出了平均分。“as_index=True”参数值的存在,df1的索引列就是“班级”,而平均分列就是“总分”列。柱形图的绘制可以用plt.bar()方法,X轴数据是df1.index,纵轴数据可以是df1.总分(注意:此时的“总分”列的值实际上是各班级的平均分)。
(2)第①空:题中已指明number是选择题数,也就是和表格列数有关。pandas中取得数据框的所有列名称可以使用columns属性,它返回了由所有列名称组成的列表,而前4列不是选择题,因此答案是len(df.columns)-4。
第②、③空:根据number的作用可知,for i in range(number)中的变量i可以认为是题号减一,由循环语句for option in 'ABCD'可知,变量option即是选项序号,因此相当于要求出每一列分别有几个“A、B、C、D”,再由下面的dfx['姓名'].使用方法可知,dfx也是一个数据框,因此第②空应该是筛选某一列数据中选项值为option的数据,因此第②空的答案为option。第③空的答案是统计数量,因此可以使用count()函数。
学科网(北京)股份有限公司
$$