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

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

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

资源简介

课时12 利用pandas进行数据统计(一)
【学业要求】
知识点 学业水平等级
1.掌握pandas基本属性值,DataFrame对象数据列和单元格的表示方法。 2
2.掌握对DataFrame对象进行数据筛选、排序和分组统计的方法。 4
(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 pd
def 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]*12
mdays=[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)城市A2021年PM2.5年平均浓度为34.6微克/立方米。由图c可知,城市A2021年PM2.5月平均浓度超过年平均浓度的月份共    个。
答案 (1)D (2)①mdays[m] ②sm+=sd 
③pm (3)5
解析 (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月。
1.pandas提供    和    两种数据结构,两者的区别见表所示。
数据结构 Series DataFrame
维度 一维   维
组成 包含一个数组的数据和一个与数据关联的索引,索引值默认是从  起递增的整数 由1个索引列(index)和若干个数据列组成,每个数据列可以是不同的 
创建 列表、字典等可以用来创建Series数据结构;与列表不同的是:Series的索引可以指定,类型可以为    通常用一个   的列表或字典来创建;或直接读取二维数据文件创建
联系 ①DataFrame可以看作是共享同一个    的Series的集合 ②DataFrame对象和Series对象均可以通过      或    来检索,还可以用at函数赋值和修改
2.pandas基本属性值
(1)index属性
行索引,默认值是从  开始递增的整数,也可以在创建对象时通过增加一列字符串类型的index属性。
(2)values属性
存放Series对象的一个数组,存放    对象的二维数据。
(3)columns属性
只针对DataFrame对象,存放各列的    标题。
3.pandas数据的检索
pandas可以通过两种方法来检索数据,一是通过三大    (Serise对象只有两大属性)来检索,如df.columns、df.index(一维数据列表),df.values(二维数据列表)。二是通过    记法,Pandas用字典来记录每列的数据,Series对象字典中每个键的值只有一个,键为index属性,值为values属性。DataFrame对象字典中每个键的值有多个,是个列表,键为columns属性,值为每列的数据。
4.pandas常用函数
函数 说明
count() 返回非空(NaN)数据项的   
sum()、mean() 求和、      ,通过axis=0/1确定行列
max()、min() 返回最大、最小值
head()、tail() 返回DataFrame的前n个、后n个数据记录
groupby() 对各列或各行中的数据进行    ,然后可对其中每一组数据进行不同的操作
sort_values()     ,通过axis=0/1确定行列,axis默认值为0,    排序。ascending=True/False确定升/降序,ascending默认值为True,    排序。排序结果返回一个新DataFrame对象
drop()       ,通过axis=0/1确定行列,并返回另一个DataFrame对象来存放改变后的数据
自我校对:1.Series DataFrame 二 0 类型 字符串型 相等长度 index 字典记法 属性 2.(1)0 (2)DataFrame (3)列 3.属性 字典 4.数量 求平均值 分组 排序 纵向 升序 删除数据
【典例】 (2025年1月浙江选考)某研究小组搭建了室外温度检测系统,在4所学校各设置了1个监测点。智能终端连接传感器,每隔3小时采集1次温度数据通过网络将温度数据传输到服务器。将系统中某年的数据导出到文件data.xlsx中,部分数据如图a所示。其中“预报温度”列是指学校所在地的天气预报温度数据,“差值”列是指实测温度与预报温度相减的绝对值。现要由高到低输出3月份各监测点差值的平均值(如图b所示),再用差值平均值最高的监测点的3月份实测温度数据绘制线形图(如图c所示)。
监测点:B 差值平均值:1.5 监测点:A 差值平均值:1.3 监测点:D 差值平均值:1.2 监测点:C 差值平均值:1.1
图b
实现上述功能的部分Python程序如下,请选择合适的代码填入划线处(填字母)。
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel("data.xlsx")
df1=①    
df2=②    
df2=③    
#依次输出df2中各监测点编号及其差值的平均值,如图b所示,代码略
#将df2中首行的监测点编号存入uid,代码略
df2=④    
#创建x列表,长度为248,元素依次为0~247,表示3月份采集时间点序号,代码略
plt.plot(x,df2['实测温度']) #绘制线形图
#设置绘图参数,并显示如图c所示的线形图,代码略
①②③④处可选代码有:    。
A.df.groupby("月",as_index=False).差值.mean() #分组求平均
B.df[df["监测点"]==uid] #筛选
C.df[df["月"]==3]
D.df1.sort_values("差值",ascending=False) #降序排序
E.df1.groupby("监测点",as_index=False).差值.mean()
F.df1[df1["监测点"]==uid]
G.df2.sort_values("差值",ascending=False)
思维点拨
明考向 本题主要考查利用pandas数据分析
精点拨 要由高到低输出3月份各监测点差值的平均值,需先筛选出3月份的数据,再分组统计平均值,最后进行降序排列。①先筛选df中出月为3的数据;②按"监测点"分组,并求“差值”平均值。③按“差值”降序排列。用差值平均值最高的监测点的3月份实测温度数据绘制线形图,需在原始数据集df1中筛选出需要的数据。④df2中首行的监测点编号存入uid,即筛选出df1监测点值为uid的数据
答案 ①C ②E ③G ④F
【变式】 学校食堂以服务质量进行了调查问卷,调查项目共 5 项(具体内容略)。12个班级的调查结果分别存储在“dy01.csv”“dy02.csv”等文件中(如图a所示),每个文件部分界面如图b所示。
现需要分析每个问题选“A”的情况,采用Python编制程序代码,请回答下列问题。
(1)定义fun_A函数实现统计某个班级5个问题的选“A”的人数,请在划线处填入合适代码。
import pandas as pd
def 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 所示的柱形图,请在划线处填入合适代码。
图c
import matplotlib.pyplot as plt
plt.title("每个问题选A的总人数")
plt.bar(①     ,②     ,label='A 选项')
plt.legend()
plt.show()
答案 (1)c=len(df[df[col]=="A"])
(2)①s[i:i+2] ②s+=ans_list[j][i]
(3)①x ②y
解析 本题考查利用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。
  Pandas的数据集有Series和DataFrame对象, Series是一维数据结构,包含一个数组的数据和一个与数据关联的索引index,索引值默认是从0起递增的整数。DataFrame是二维的数据结构,由1个索引列(index)和若干个数据列组成,因此有index属性(表示所处的行号)、columns属性(列标题)和values属性(每条记录的各个字段值)。Pandas的主要功能是计算一个集合对象中每个字段的记录数量(count)、总和(sum)、平均值(mean)和最值(最大值max或最小值min)。
DataFrame对象数据集的一行称为一条记录,每条记录拥有相同的字段数量,可以通过筛选功能找出符合条件的若干条记录(子集),再利用子集进行统计或数据可视化。还可以通过分组功能,将某个字段相同的字段值所在记录形成若干个子集,相当于按某个字段进行排序,按相同字段值的记录划分子集,再对子集进行求和等统计。
综上所述,Pandas主要功能是按列统计集合、子集或集合的某几个字段的数量、总和、平均值和最值,要关注对象(集合)的名称和统计方法。分组统计后,字段数量和名称不变,除分组依据列的名称外,其余字段的含义和数据类型将发生改变。
1.学校暑期开展“青春迎亚运”活动,邀请高二学生每日参加运动锻炼并进行线上打卡。每周收集一次相关数据,分别保存在相应的xlsx文件中,部分文件如图a所示;每个文件记录了一周7天的打卡数据,示例如图b所示,其中运动时长单位:分钟。
图a
图b
为统计分析学生锻炼情况,给出周报数据,编写Python程序,请回答以下问题:
(1)定义px函数,功能为:读取某一周的打卡数据,将其按班级进行排序操作并返回结果。函数代码如下,将划线处代码补充完整。
import pandas as pd
def px(file_week):
 df=pd.read_excel(file_week)
 df=df.sort_values(    ,ignore_index=True)
 #按班级升序排序,参数ignore_index=True 表示更新索引
 return df
(2)统计某一周各运动项目的参与人次,并绘制柱形图,部分Python代码如下:
import matplotlib. pyplot as plt
s=input("请输入文件名:")
df=px(s)
df1=df.groupby("运动项目",as_index=False).①     #统计各运动项目参与人次
df1.rename(columns={"学号":"参与人次"},inplace=True) #更改列标题
plt.bar(②    )
plt.xlabel("运动项目")
plt.ylabel("参与人次")
plt.show()
划线处应填入的代码为    (单选,填字母)。
A.①count()
②df1["参与人次"],df1["运动项目"]
B.①sum()
②df1["参与人次"],df1["运动项目"]
C.①sum() ②df1.运动项目,df1.参与人次
D.①count() ②df1.运动项目,df1.参与人次
(3)统计某一周每班各学生的总运动时长后,比较得出该周每班最高的前两位时长,部分Python程序代码如下,请在划线处填入合适的代码。
qp=[[0 for i in range(m)]for j in range(n)]
'''
定义数组qp记录每班各学生一周运动总时长,n为班级数,m为每班人数。其中qp[0][0]~qp[0][m-1]存储1班1号~m号同学的每周运动总时长,以此类推,qp[n-1][0]~qp[n-1][m-1]存储n班1号~m号同学的每周运动总时长。
'''
print("本周每班最高的前两位时长分别为:")
i=0
while i num=df["学号"][i]
 cla=df["班级"][i]
 ①   
 if i!=0 and df["班级"][i]!=df["班级"][i-1] or②    :
   cla=df["班级"][i-1]
   k1=0;k2=0
   for j in range(1,len(qp[cla-1])):
    if qp[cla-1][j]>qp[cla-1][k1]:
      ③   
      k1=j
    elif qp[cla-1][j]>qp[cla-1][k2]:
      k2=j
    print(cla,"班",qp[cla -1][k1],qp[cla -1][k2])
 i=i+1
(4)统计某一周各运动项目的参与人次后绘制柱形图如图c所示,由图可知,该周参与人气最高的运动项目为       。
图c
答案 (1)'班级' (2)D
(3)①qp[cla-1][num-1]+=df['运动时长'][i] ②i==len(df)-1 ③k2=k1 (4)跑步
解析 (1)题目要求按班级进行排序。(2)统计各运动项目参与人次用count函数。图表的x和y轴分别为运动项目和参与人次。(3)①从df中获取每位同学的数据。while循环遍历df中的每一位同学,num和cla对应该同学的班级和学号,则可对qp进行赋值,获取每位同学的运动时长。②最后一个班级的情况。条件i!=0 and df["班级"][i]!=df["班级"][i-1],表示找出两个不同的班级。若最后几位学生都在同一个班级,显示不满足条件df["班级"][i]!=df["班级"][i-1],那么最后一个班级的情况也要做出处理。③for循环对当前班级的学生进行遍历,选取最大的前两位时长,第一个判断语句qp[cla-1][j]>qp[cla-1][k1]时,则表示j学生的时长比之前的最大值大,则j同学变为新的最大值时长,k1同学变为新的第二大的时长。(4)略。
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 pd
xb=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 plt
plt.title(xb +"生取名常用字")
plt.bar(df3.字,     )
plt.show()
答案 (1)① df.at[i,"性别"]==xb 或 df["性别"][i]==xb 或 df.性别[i]==xb ②mz (2)D (3)df3.个数 或 df3["个数"]
解析 (1)①遍历学生名单每一行,取出当前行学生姓名,找出当前行中性别df.at[i,"性别"]等于性别xb的学生记录。②将符合条件学生名字中每个文字存储到列表mz,并返回列表。(2)利用字典data创建一个df1对象,该对象有“字”和“个数”两列,“字”列是提取的每个姓名中的字符,对应的数量均为1,按“字”分组并统计出现的次数,因此需按"个数"进行降序排列,并取出最大(最前面)的10条记录。(3)图表中横轴为出现的最常见的10个字,纵轴为每个字对应出现的次数。
3.管理员从该停车系统中导出了 3 月份每天的停车记录,如图a 所示,每天的停车记录内容格式如图b 所示(进出标记为 0 表示驶入,1 表示驶出,停车记录已按进出时间升序排列)。
车牌 进出时间 进出标记
川B·8CC88 2023-3-23-06:09:56 0
川A·A98A8 2023-3-23-06:28:04 0
川C·9VV99 2023-3-23-06:56:45 0
川B·8UU88 2023-3-23-07:01:29 0
川C·9VV99 2023-3-23-07:48:01 1
图b
为统计停车场3月份每天的收入(只有驶入或驶出记录的车辆不参与计费),编写Python程序。
(1)定义readdata函数,功能为:读取某一车牌车辆当天的进出时间记录,返回该车辆当天的停车总费用。参数 data 为该车牌当天的进出时间记录。函数代码如下,请回答下列问题:
def catime(t1,t2):
 #计算时间t1 与时间 t2 之间的时间差并计算本次停车的费用,函数返回停车费用,代码略。
def readdata(data):
 m=len(data)
 p=0;cost=0;total=0
 while p   if (1)     :
     cost=catime(data.进出时间[p],data.进出时间[p+1])
     total+=cost
     p+=1
   ②   
 return total
①程序段中加框处应填入的代码为    (单选,填字母)。
A.data.进出标记[p]==0
B.data.进出标记[p-1]==0 and data.进出标记[p]==1
C.data.进出标记[p+1]==1
D.data.进出标记[p]==0 and data.进出标记[p+1]==1
②请在程序段划线处填入合适的代码。
(2)统计停车场 3 月份每天的收入并绘制柱形图,部分Python代码如下,请在划线处填入合适的代码。
图c
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)
plt.title("某停车场3月份整体收入图")
plt.bar(dic.keys(),dic.values())
plt.show()
(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)略。
4.小明通过调查问卷收集了某餐厅近期上新菜品的顾客满意度情况数据,一周的调查结果分别存储在“day1.csv”、“day2.csv”等文件中(如图a所示),每个文件部分界面如图b所示。为统计分析新菜品点菜人数及各满意程度,编写Python程序,回答下列问题:
(1)定义fun函数,实现统计某天某个新菜品的点菜数及满意、一般、不满意的数量,请在划线处填入合适的代码。
import pandas as pd
def 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
  return ans
(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:
   ans=fun(filename,menu)
df1=pd.DataFrame(ans,index=["点菜数","满意数","一般数","不满意数"]) #利用字典ans创建df1对象。
df1=df1.T #将df1对象进行行列转置
print(df1)
(3)计算每道菜品“满意率”,按照“满意率”升序排序后绘制柱形图,如图d所示:
图d
df1["满意率"]=df1.满意数/df1.点菜数*100
df2=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属性,纵轴是排序后的满意率。
1.小明为了研究某地近十年每月的温差变化,编写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所示,请在划线处填入代码。
def find(r,t):
  dic={"日期":r,"温差":t}
  df1=pd.DataFrame(dic)
  df2=       
  return df2
(3)绘制4月份每天的温差柱形图,部分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()
print(find(date,td))
答案 (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。
2.小美收集了某电商平台某年1~12月的“十大”空调品牌的销售数据,每个月的数据保存在一个csv文件中,文件如图b所示,分别记录了对应月份的订单数据。
请回答下列问题:
(1)定义get_sales函数,功能为:读取某月的CSV文件,返回某品牌当月的销售额。函数代码如下,划线处应填入的代码为    (单选,填字母)。
A.df[df['品牌']==brand]
B.df[df['品牌']==month]
C.df['品牌']==brand
D.df['品牌']==month
import pandas as pd
def get_sales(brand,month):
 filename=str(month)+'.csv'
 df=pd.read_csv(filename) #读取文件
 df=       
 sales=(df['数量']*df['单价']).sum() #求出df中所有数量*单价的总和
 return sales
(2)统计十大品牌全年销售额,并找出销售额最大的品牌,绘制该品牌的1~12月销售额的线形图,部分Python程序如下,请在划线处填写合适的代码。
import matplotlib.pyplot as plt
brand_dict={'格力':0,'美的':0,'海尔':0,'奥克斯':0,'海信':0,'三菱重工':0,'日立':0,'华菱':0,'TCL':0,'大金':0}
x,y=[],[]
max_sales,brandmax=0,''
for i in range(1,13):
 for j in brand_dict:
   brand_dict[j]+=①   
for i in brand_dict:
  if brand_dict[i]>max_sales:
   max_sales=brand_dict[i]
   ②   
for i in range(1,13):
 x.append(③    )
  y.append(get_sales(brandmax,i))
plt.plot(x,y)
plt.show() #生成线形图如图c所示
(3)由图c可知,该空调销售额增量最大的月份是    。
答案 (1)A (2)①get_sales(j,i) ②brandmax=i
③i (3)11
解析 本题考查pandas数据处理。(1)get_sales函数读取某月的CSV文件,返回某品牌当月的销售额,函数两个参数:month为月份,brand应为品牌。(2)①brand_dict字典用于统计每种品牌的全年销售额,外循环i遍历月份,内循环j遍历品牌名称,此处可利用自定义函数来累加该品牌每月销售额。②处求所有品牌全年销售额的最大值max_sales和最大值的品牌名称brandmax。(3)略。
3.一球迷收集了近3个赛季的CBA比赛数据,每个赛季的数据分别保存在独立文件中,如图a所示,文件中数据记录格式如图b所示,以球员“布莱克尼”的“二分”数据“7.9-16.3”为例,7.9表示二分球平均命中数量,16.3表示二分球平均投篮次数。
图c
该球迷想根据历史赛季数据预测各球队下个赛季的首发阵容,编写了如下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 pd
def 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 plt
def showChart(tean, menbers) :
 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]中。
4.某高校某专业在学期结束时,举行本学期最受欢迎教授评选活动。本学期共有10位教授进行授课,评选方式采用不记名投票的方式,每位学生有一张选票,可勾选3个教授,多选或者少选都是无效票。选票数据存储在"选票统计.xlsx"中,如图a所示。现要对选票的有效性进行判断并统计每个候选人的最终得票。请回答下列问题:
                
(1)本专业共有151名学生参加了此次投票活动,根据规则,每名学生只能选3位教授,多选或少选都是无效票,表中标有数字1的代表投了对应教授的票,空的表示没有对该教授投票。将选票数据从文件读取后存入DataFrame对象df。部分代码如下:
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel("选票统计.xlsx")
为了能正确选出有效票,加框处代码可选的是    (单选,填字母)。
A.df["投票数"]=df.sum(axis=0)
df1=df[df["投票数"]==3]
B.df["投票数"]=df.mean(axis=0)
df1=df[df["投票数"]==1]
C.df["投票数"]=df.sum(axis=1)
df1=df[df["投票数"]==3]
D.df["投票数"]=df.mean(axis=1)
df1=df[df["投票数"]==1]
(2)对已选出的有效票进行处理,统计每位教授的最终得票(如图b所示)。将各个教授的选票数从高到低进行排序,部分代码如下,请在划线处填入合适的代码。
df2=df1.T
#仅将教授的名称与得票总数保存到DataFrame对象df2中,代码略
df2=df2.sort_values("   ",ascending=False,ignore_index=True)
(3)根据得票数,选出得票数最高的3位教授(如出现第3名相同票数时,也将相同票数的教授都选出,并交给评审委员会最终投票决定)。绘制出如下柱形图,实现该功能的程序如下:
  
x=df3.教授
y=    
plt.bar(x,y)
#设置图表各项参数,代码略
①划线处代码为    。
②加框处代码正确选项是    (多选,填字母)。
A.df3=df2[df2.得票数>=df2.at[2,"得票数"]]
B.df3=df2[df2.得票数>=df2.at[3,"得票数"]]
C.df3=df2[df2.得票数>=df2.values[2][1]]
D.df3=df2[df2.得票数>=df2.得票数[3]]
答案 (1)C (2)得票数
(3)①df3.得票数或df3["得票数"] ②AC
解析 (1)先把每张选票的投票数计算出来,然后再筛选出投票数为 3 的有效选票。(2)筛选出的有效选票转置处理后得到图 b,按照“得票数”为关键字进行降序排序。(3)①图表的横轴是教授名称,纵轴为得票数。②A选项索引为 2 的得票数为第3位教授,筛选出大于等于该值的为并列第3名,都要筛选出来。B选项索引为3的是第4位教授。C选项values属性是DataFrame对象, df2.values[2][1]表示第3个元素的第2个数据项。
5.高一年级(9个班级)进行“七选三”预选科。每个班一个Excel文件(如图a所示)存储预选科数据。数据表中“1”代表学生选择该科目,空白代表学生未选择该科目(某班部分选科数据如图b所示)。请回答下列问题。
(1)定义如下函数check(dfs)检查选考科目数是否有误,其中参数dfs为DataFrame对象,由如图b所示Excel数据导入。返回值erlst为列表,列表元素数据类型为整型,表示错误数据行对应的学生序号(例如第6行学生“戴*跃”的序号为5)。
def check(dfs):
 erlst=[]
 for i in range(len(dfs)):
   xk_sum=0
   for j in dfs.columns[2:]:
    dyg=①    
    if dyg==1:
      xk_sum+=dyg
  if xk_sum!=3:
    erlst.append(②     )
return erlst
①在程序中划线处填入的正确代码为    (单选,填字母)。
A.dfs.at['i','j'] B.dfs.at['j','i']
C.dfs.at[i,j] D.dfs.at[j,i]
②在程序中划线处填入合适的代码。
(2)读取每个班级的Excel选科数据,若检查无误,则统计每个班级同时选报“物理”和“化学”学科的人数,存储在字典ans中。实现该功能的Python程序如下:
import pandas as pd
ans={}
for i in range(1,10):
 filename=str(i)+'. xlsx'
 df=pd.read_excel(filename)
 errlist=check(df)
 if errlist!=[]:
   print("请检查文件",filename,"中序号为",errlist,"的学生")
 else:
   ①      #筛选同时选择物理和化学的数据记录存储在df1中
   ans[str(i)+'班']=[②     ] #形如{“1班”:[41]}
①在程序划线处应填入的正确代码段为    (多选,填字母)。
A.df1=df[df['物理']==1] 
df1=df1[df1['化学']==1]
B.df1=df[df['物理']==1]
df1=df[df['化学']==1]
C.df1=df[df['化学']==1]
df1=dfl[df1['物理']==1]
D.df1=df[df['化学']==1]
df1=df[df['物理']==1]
②在程序划线处填入合适的代码。
(3)用字典ans创建并转置的DataFrame对象如图c所示,绘制柱形图如图d所示。实现该功能的Python程序如下:
import matplotlib.pyplot as plt
adf=pd.DataFrame(ans,index=['人数']).T
plt.bar(    )
#设置绘图参数,代码略
plt.show()
程序的划线处应填入的正确代码为    (单选,填字母)。
A.adf.人数,adf.班级
B.adf.班级,adf.人数
C.adf.人数,adf.index
D.adf.index,adf.人数
答案 (1)①C ②i+1 (2)①AC
②len(df1)或len(df1.index) (3)D
解析 (1)①函数check检查选考科目数是否有误,变量i表示学生所在行索引,j表示列的名称,因此用变量dfs.at[i,j]表示某个单元格的名称。②函数返回错误数据行对应的学生序号,序号为行索引i加1。(2)①先筛选出选物理的学生记录,保存在对象df1中,再在df1中筛选出选化学的学生;或者先筛选出选化学的学生记录,再筛选出选物理的学生记录。②统计每个班级同时选报“物理”和“化学”学科的人数,而该人数就是对象df1的记录的数量len(df1)。(3)利用字典ans创建对象adf,字典的键为各个列标题的名称,值为每一行的记录值,该对象只有一行记录,且设置index为人数。转置是对行列发生变换,一共有10行,对应的属性是index,只有一列,列的标题是人数。
6.土质监测系统已采集了大棚一年的土壤湿度数据,该大棚土壤湿度的正常范围为60-80(单位:%)。现要对这些数据进行分析,请回答下列问题:
(1)将监测系统的数据导出,存于humdata.xlsx文件中,如图a所示。现要找出6月份土壤湿度超出正常范围次数最多的监测点,并统计该监测点6月份土壤湿度超出正常范围的日分布情况,绘制如图b所示的柱形图。实现上述功能的部分Python程序如下,请选择合适的代码填入划线处(单选)。
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel("humdata.xlsx")
df1=df[df.月==6]
df2=df1[(df1["湿度"]<60)|(df1["湿度"]>80)] #筛选df1中湿度值超出正常范围的数据
df_g=①     
df_sort=②     
#将df_sort首行的监测点存入p,代码略
df3=③    
df3_g=df3.groupby("日",as_index=False).count()
plt.bar(df3_g["日"],df3_g["湿度"])
#设置绘图参数,显示如图b所示的柱形图,代码略程序中①②③处可选的代码有:    。
A.df1[df1.监测点==p]
B.df2[df2.监测点==p]
C.df_g.sort_values("湿度",ascending=True)
D.df_g.sort_values("湿度",ascending=False)
E.df2.groupby("监测点",as_index=False).sum()
F.df2.groupby("监测点",as_index=False).count()
(2)将6月某监测点的土壤湿度数据存储于列表data中,要求找出其中长度为5的连续子序列,使得该子序列的所有湿度值均在正常范围内,且其平均湿度最大(若存在多个,则选择最早出现的子序列),并输出该子序列的平均湿度值及其起始下标(保证至少存在一个有效解)。实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#读入土壤湿度数据,按采集的时间顺序存储于列表data中,代码略
max=-1
count=sum=0
for i in range(5):
 sum+=①    
 if not (60<=data[i]<=80):
   count+=1
if count==0:
 max=sum
 start=0
i=1
while i<=len(data)-5:
 sum-=data[i-1]
 if not(60<=data[i-1]<=80):
   count-=1
 ②    
 if not(60<=data[i+4]<=80):
   count+=1
 if ③     :
   max=sum
   start=i
 i+=1
print("最高平均湿度值:"+str(max/5)+",起始下标:"+str(start))
答案 (1)①F ②D ③B (2)①data[i]
②sum+=data[i+4] ③count==0 and sum>max
解析 (1)要找出6月份土壤湿度超出正常范围次数最多的监测点,并统计该监测点6月份土壤湿度超出正常范围的日分布情况。①先按监测点分组统计每个监测点超出正常范围的次数。②再按湿度降序排序。③最后在湿度值超出正常范围的数据df2中筛选出监测点为p的数据。(2)①模块for i in range(5)的作用是统计data中前5个元素的情况,统计前5个数据的总和sum以及非正常数据的个数count,如果没有不正常的,那么最大值更新为sum。②循环变量i从1开始,遍历到len(data)-5,每段去除i-1位置的数据,加入i+4的数据,实现不断向后滑动遍历5个数据。每段的5个数据为从索引i至i+4,从sum中先减去data[i-1],再加上新数据data[i+4],就是每段的总和。③若data[i-1]属于非正常数据,那么在新的一段中,count的值将要减去1;若数据data[i+4]n属于非正常范围,那么count的值将要加1。若count的值为0且sum大于max,就是符合条件最大长度。(共102张PPT)
必修一 数据与计算
课时12 利用pandas进行数据统计(一)
知识点 学业水平等级
1.掌握pandas基本属性值,DataFrame对象数据列和单元格的表示方法。 2
2.掌握对DataFrame对象进行数据筛选、排序和分组统计的方法。 4
目 录
CONTENTS
真题剖析
01
知识梳理
02
课堂突破
03
当堂检测
04
课后作业
05
真题剖析
1
(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 pd
def 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]*12
mdays=[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)城市A2021年PM2.5年平均浓度为34.6微克/立方米。由图c可知,城市A2021年PM2.5月平均浓度超过年平均浓度的月份共________个。
答案 (1)D (2)①mdays[m] ②sm+=sd ③pm (3)5
解析 (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月。
知识梳理
2
1.pandas提供________和___________两种数据结构,两者的区别见表所示。
Series
数据结构 Series DataFrame
维度 一维 ____维
组成 包含一个数组的数据和一个与数据关联的索引,索引值默认是从____起递增的整数 由1个索引列(index)和若干个数据列组成,每个数据列可以是不同的______
创建 列表、字典等可以用来创建Series数据结构;与列表不同的是:Series的索引可以指定,类型可以为_________ 通常用一个_________的列表或字典来创建;或直接读取二维数据文件创建
联系 ①DataFrame可以看作是共享同一个________的Series的集合 ②DataFrame对象和Series对象均可以通过____________或________来检索,还可以用at函数赋值和修改
DataFrame

0
类型
字符串型
相等长度
index
字典记法
属性
2.pandas基本属性值
(1)index属性
行索引,默认值是从____开始递增的整数,也可以在创建对象时通过增加一列字符串类型的index属性。
(2)values属性
存放Series对象的一个数组,存放____________对象的二维数据。
(3)columns属性
只针对DataFrame对象,存放各列的________标题。
0
DataFrame

3.pandas数据的检索
pandas可以通过两种方法来检索数据,一是通过三大________(Serise对象只有两大属性)来检索,如df.columns、df.index(一维数据列表),df.values(二维数据列表)。二是通过________记法,Pandas用字典来记录每列的数据,Series对象字典中每个键的值只有一个,键为index属性,值为values属性。DataFrame对象字典中每个键的值有多个,是个列表,键为columns属性,值为每列的数据。
属性
字典
4.pandas常用函数
数量
函数 说明
count() 返回非空(NaN)数据项的______
sum()、mean() 求和、____________,通过axis=0/1确定行列
max()、min() 返回最大、最小值
head()、tail() 返回DataFrame的前n个、后n个数据记录
groupby() 对各列或各行中的数据进行________,然后可对其中每一组数据进行不同的操作
求平均值
分组
函数 说明
sort_values() ________,通过axis=0/1确定行列,axis默认值为0,________排序。ascending=True/False确定升/降序,ascending默认值为True,________排序。排序结果返回一个新DataFrame对象
drop() ____________,通过axis=0/1确定行列,并返回另一个DataFrame对象来存放改变后的数据
排序
纵向
升序
删除数据
课堂突破
3
【典例】 (2025年1月浙江选考)某研究小组搭建了室外温度检测系统,在4所学校各设置了1个监测点。智能终端连接传感器,每隔3小时采集1次温度数据通过网络将温度数据传输到服务器。将系统中某年的数据导出到文件data.xlsx中,部分数据如图a所示。其中“预报温度”列是指学校所在地的天气预报温度数据,“差值”列是指实测温度与预报温度相减的绝对值。现要由高到低输出3月份各监测点差值的平均值(如图b所示),再用差值平均值最高的监测点的3月份实测温度数据绘制线形图(如图c所示)。
监测点:B 差值平均值:1.5
监测点:A 差值平均值:1.3
监测点:D 差值平均值:1.2
监测点:C 差值平均值:1.1
图b
实现上述功能的部分Python程序如下,请选择合适的代码填入划线处(填字母)。
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel("data.xlsx")
df1=①________
df2=②________
df2=③________
#依次输出df2中各监测点编号及其差值的平均值,如图b所示,代码略
#将df2中首行的监测点编号存入uid,代码略
df2=④________
#创建x列表,长度为248,元素依次为0~247,表示3月份采集时间点序号,代码略
plt.plot(x,df2['实测温度']) #绘制线形图
#设置绘图参数,并显示如图c所示的线形图,代码略
①②③④处可选代码有:________。
A.df.groupby("月",as_index=False).差值.mean() #分组求平均
B.df[df["监测点"]==uid] #筛选
C.df[df["月"]==3]
D.df1.sort_values("差值",ascending=False) #降序排序
E.df1.groupby("监测点",as_index=False).差值.mean()
F.df1[df1["监测点"]==uid]
G.df2.sort_values("差值",ascending=False)
答案 ①C ②E ③G ④F
思维点拨
明考向 本题主要考查利用pandas数据分析
精点拨 要由高到低输出3月份各监测点差值的平均值,需先筛选出3月份的数据,再分组统计平均值,最后进行降序排列。①先筛选df中出月为3的数据;②按"监测点"分组,并求“差值”平均值。③按“差值”降序排列。用差值平均值最高的监测点的3月份实测温度数据绘制线形图,需在原始数据集df1中筛选出需要的数据。④df2中首行的监测点编号存入uid,即筛选出df1监测点值为uid的数据
【变式】 学校食堂以服务质量进行了调查问卷,调查项目共 5 项(具体内容略)。12个班级的调查结果分别存储在“dy01.csv”“dy02.csv”等文件中(如图a所示),每个文件部分界面如图b所示。
现需要分析每个问题选“A”的情况,采用Python编制程序代码,请回答下列问题。
(1)定义fun_A函数实现统计某个班级5个问题的选“A”的人数,请在划线处填入合适代码。
import pandas as pd
def 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 所示的柱形图,请在划线处填入合适代码。
图c
import matplotlib.pyplot as plt
plt.title("每个问题选A的总人数")
plt.bar(①__________,②__________,label='A 选项')
plt.legend()
plt.show()
答案 (1)c=len(df[df[col]=="A"]) (2)①s[i:i+2] ②s+=ans_list[j][i]
(3)①x ②y
解析 本题考查利用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。
  Pandas的数据集有Series和DataFrame对象, Series是一维数据结构,包含一个数组的数据和一个与数据关联的索引index,索引值默认是从0起递增的整数。DataFrame是二维的数据结构,由1个索引列(index)和若干个数据列组成,因此有index属性(表示所处的行号)、columns属性(列标题)和values属性(每条记录的各个字段值)。Pandas的主要功能是计算一个集合对象中每个字段的记录数量(count)、总和(sum)、平均值(mean)和最值(最大值max或最小值min)。
DataFrame对象数据集的一行称为一条记录,每条记录拥有相同的字段数量,可以通过筛选功能找出符合条件的若干条记录(子集),再利用子集进行统计或数据可视化。还可以通过分组功能,将某个字段相同的字段值所在记录形成若干个子集,相当于按某个字段进行排序,按相同字段值的记录划分子集,再对子集进行求和等统计。
综上所述,Pandas主要功能是按列统计集合、子集或集合的某几个字段的数量、总和、平均值和最值,要关注对象(集合)的名称和统计方法。分组统计后,字段数量和名称不变,除分组依据列的名称外,其余字段的含义和数据类型将发生改变。
当堂检测
4
1.学校暑期开展“青春迎亚运”活动,邀请高二学生每日参加运动锻炼并进行线上打卡。每周收集一次相关数据,分别保存在相应的xlsx文件中,部分文件如图a所示;每个文件记录了一周7天的打卡数据,示例如图b所示,其中运动时长单位:分钟。
图a
图b
为统计分析学生锻炼情况,给出周报数据,编写Python程序,请回答以下问题:
(1)定义px函数,功能为:读取某一周的打卡数据,将其按班级进行排序操作并返回结果。函数代码如下,将划线处代码补充完整。
import pandas as pd
def px(file_week):
 df=pd.read_excel(file_week)
 df=df.sort_values(________,ignore_index=True)
 #按班级升序排序,参数ignore_index=True 表示更新索引
 return df
(2)统计某一周各运动项目的参与人次,并绘制柱形图,部分Python代码如下:
import matplotlib. pyplot as plt
s=input("请输入文件名:")
df=px(s)
df1=df.groupby("运动项目",as_index=False).①________ #统计各运动项目参与人次
df1.rename(columns={"学号":"参与人次"},inplace=True) #更改列标题
plt.bar(②________)
plt.xlabel("运动项目")
plt.ylabel("参与人次")
plt.show()
划线处应填入的代码为________(单选,填字母)。
A.①count()
②df1["参与人次"],df1["运动项目"]
B.①sum()
②df1["参与人次"],df1["运动项目"]
C.①sum() ②df1.运动项目,df1.参与人次
D.①count() ②df1.运动项目,df1.参与人次
(3)统计某一周每班各学生的总运动时长后,比较得出该周每班最高的前两位时长,部分Python程序代码如下,请在划线处填入合适的代码。
qp=[[0 for i in range(m)]for j in range(n)]
'''
定义数组qp记录每班各学生一周运动总时长,n为班级数,m为每班人数。其中qp[0][0]~qp[0][m-1]存储1班1号~m号同学的每周运动总时长,以此类推,qp[n-1][0]~qp[n-1][m-1]存储n班1号~m号同学的每周运动总时长。
'''
print("本周每班最高的前两位时长分别为:")
i=0
while i num=df["学号"][i]
 cla=df["班级"][i]
 ①______
 if i!=0 and df["班级"][i]!=df["班级"][i-1] or②________:
   cla=df["班级"][i-1]
   k1=0;k2=0
   for j in range(1,len(qp[cla-1])):
    if qp[cla-1][j]>qp[cla-1][k1]:
      ③______
      k1=j
    elif qp[cla-1][j]>qp[cla-1][k2]:
      k2=j
    print(cla,"班",qp[cla -1][k1],qp[cla -1][k2])
 i=i+1
(4)统计某一周各运动项目的参与人次后绘制柱形图如图c所示,由图可知,该周参与人气最高的运动项目为______________。
图c
答案 (1)'班级' (2)D
(3)①qp[cla-1][num-1]+=df['运动时长'][i] ②i==len(df)-1 ③k2=k1 (4)跑步
解析 (1)题目要求按班级进行排序。(2)统计各运动项目参与人次用count函数。图表的x和y轴分别为运动项目和参与人次。(3)①从df中获取每位同学的数据。while循环遍历df中的每一位同学,num和cla对应该同学的班级和学号,则可对qp进行赋值,获取每位同学的运动时长。②最后一个班级的情况。条件i!=0 and df["班级"][i]!=df["班级"][i-1],表示找出两个不同的班级。若最后几位学生都在同一个班级,显示不满足条件df["班级"][i]!=df["班级"][i-1],那么最后一个班级的情况也要做出处理。③for循环对当前班级的学生进行遍历,选取最大的前两位时长,第一个判断语句qp[cla-1][j]>qp[cla-1][k1]时,则表示j学生的时长比之前的最大值大,则j同学变为新的最大值时长,k1同学变为新的第二大的时长。(4)略。
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 pd
xb=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 plt
plt.title(xb +"生取名常用字")
plt.bar(df3.字,__________)
plt.show()
答案 (1)① df.at[i,"性别"]==xb 或 df["性别"][i]==xb 或 df.性别[i]==xb ②mz (2)D (3)df3.个数 或 df3["个数"]
解析 (1)①遍历学生名单每一行,取出当前行学生姓名,找出当前行中性别
df.at[i,"性别"]等于性别xb的学生记录。②将符合条件学生名字中每个文字存储到列表mz,并返回列表。(2)利用字典data创建一个df1对象,该对象有“字”和“个数”两列,“字”列是提取的每个姓名中的字符,对应的数量均为1,按“字”分组并统计出现的次数,因此需按"个数"进行降序排列,并取出最大(最前面)的10条记录。(3)图表中横轴为出现的最常见的10个字,纵轴为每个字对应出现的次数。
3.管理员从该停车系统中导出了 3 月份每天的停车记录,如图a 所示,每天的停车记录内容格式如图b 所示(进出标记为 0 表示驶入,1 表示驶出,停车记录已按进出时间升序排列)。
车牌 进出时间 进出标记
川B·8CC88 2023-3-23-06:09:56 0
川A·A98A8 2023-3-23-06:28:04 0
川C·9VV99 2023-3-23-06:56:45 0
川B·8UU88 2023-3-23-07:01:29 0
川C·9VV99 2023-3-23-07:48:01 1
图b
为统计停车场3月份每天的收入(只有驶入或驶出记录的车辆不参与计费),编写Python程序。
(1)定义readdata函数,功能为:读取某一车牌车辆当天的进出时间记录,返回该车辆当天的停车总费用。参数 data 为该车牌当天的进出时间记录。函数代码如下,请回答下列问题:
def catime(t1,t2):
 #计算时间t1 与时间 t2 之间的时间差并计算本次停车的费用,函数返回停车费用,代码略。
def readdata(data):
 m=len(data)
 p=0;cost=0;total=0
 while p     cost=catime(data.进出时间[p],data.进出时间[p+1])
     total+=cost
     p+=1
   ②______
 return total
①程序段中加框处应填入的代码为________(单选,填字母)。
A.data.进出标记[p]==0
B.data.进出标记[p-1]==0 and data.进出标记[p]==1
C.data.进出标记[p+1]==1
D.data.进出标记[p]==0 and data.进出标记[p+1]==1
②请在程序段划线处填入合适的代码。
(2)统计停车场 3 月份每天的收入并绘制柱形图,部分Python代码如下,请在划线处填入合适的代码。
图c
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)
plt.title("某停车场3月份整体收入图")
plt.bar(dic.keys(),dic.values())
plt.show()
(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)略。
4.小明通过调查问卷收集了某餐厅近期上新菜品的顾客满意度情况数据,一周的调查结果分别存储在“day1.csv”、“day2.csv”等文件中(如图a所示),每个文件部分界面如图b所示。为统计分析新菜品点菜人数及各满意程度,编写Python程序,回答下列问题:
(1)定义fun函数,实现统计某天某个新菜品的点菜数及满意、一般、不满意的数量,请在划线处填入合适的代码。
import pandas as pd
def 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
  return ans
(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:
   ans=fun(filename,menu)
df1=pd.DataFrame(ans,index=["点菜数","满意数","一般数","不满意数"]) #利用字典ans创建df1对象。
df1=df1.T #将df1对象进行行列转置
print(df1)
(3)计算每道菜品“满意率”,按照“满意率”升序排序后绘制柱形图,如图d所示:
图d
df1["满意率"]=df1.满意数/df1.点菜数*100
df2=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属性,纵轴是排序后的满意率。
课时作业
5
1.小明为了研究某地近十年每月的温差变化,编写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所示,请在划线处填入代码。
def find(r,t):
  dic={"日期":r,"温差":t}
  df1=pd.DataFrame(dic)
  df2=______________
  return df2
(3)绘制4月份每天的温差柱形图,部分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()
print(find(date,td))
答案 (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。
2.小美收集了某电商平台某年1~12月的“十大”空调品牌的销售数据,每个月的数据保存在一个csv文件中,文件如图b所示,分别记录了对应月份的订单数据。
请回答下列问题:
(1)定义get_sales函数,功能为:读取某月的CSV文件,返回某品牌当月的销售额。函数代码如下,划线处应填入的代码为________(单选,填字母)。
A.df[df['品牌']==brand]
B.df[df['品牌']==month]
C.df['品牌']==brand
D.df['品牌']==month
import pandas as pd
def get_sales(brand,month):
 filename=str(month)+'.csv'
 df=pd.read_csv(filename) #读取文件
 df=______________
 sales=(df['数量']*df['单价']).sum() #求出df中所有数量*单价的总和
 return sales
(2)统计十大品牌全年销售额,并找出销售额最大的品牌,绘制该品牌的1~12月销售额的线形图,部分Python程序如下,请在划线处填写合适的代码。
import matplotlib.pyplot as plt
brand_dict={'格力':0,'美的':0,'海尔':0,'奥克斯':0,'海信':0,'三菱重工':0,'日立':0,'华菱':0,'TCL':0,'大金':0}
x,y=[],[]
max_sales,brandmax=0,''
for i in range(1,13):
 for j in brand_dict:
   brand_dict[j]+=①______
for i in brand_dict:
  if brand_dict[i]>max_sales:
   max_sales=brand_dict[i]
   ②______
for i in range(1,13):
 x.append(③________)
  y.append(get_sales(brandmax,i))
plt.plot(x,y)
plt.show() #生成线形图如图c所示
(3)由图c可知,该空调销售额增量最大的月份是________。
答案 (1)A (2)①get_sales(j,i) ②brandmax=i ③i (3)11
解析 本题考查pandas数据处理。(1)get_sales函数读取某月的CSV文件,返回某品牌当月的销售额,函数两个参数:month为月份,brand应为品牌。(2)①brand_dict字典用于统计每种品牌的全年销售额,外循环i遍历月份,内循环j遍历品牌名称,此处可利用自定义函数来累加该品牌每月销售额。②处求所有品牌全年销售额的最大值max_sales和最大值的品牌名称brandmax。(3)略。
3.一球迷收集了近3个赛季的CBA比赛数据,每个赛季的数据分别保存在独立文件中,如图a所示,文件中数据记录格式如图b所示,以球员“布莱克尼”的“二分”数据“7.9-16.3”为例,7.9表示二分球平均命中数量,16.3表示二分球平均投篮次数。
图c
该球迷想根据历史赛季数据预测各球队下个赛季的首发阵容,编写了如下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 pd
def 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 plt
def showChart(tean, menbers) :
 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]中。
4.某高校某专业在学期结束时,举行本学期最受欢迎教授评选活动。本学期共有10位教授进行授课,评选方式采用不记名投票的方式,每位学生有一张选票,可勾选3个教授,多选或者少选都是无效票。选票数据存储在"选票统计.xlsx"中,如图a所示。现要对选票的有效性进行判断并统计每个候选人的最终得票。请回答下列问题:
(1)本专业共有151名学生参加了此次投票活动,根据规则,每名学生只能选3位教授,多选或少选都是无效票,表中标有数字1的代表投了对应教授的票,空的表示没有对该教授投票。将选票数据从文件读取后存入DataFrame对象df。部分代码如下:
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel("选票统计.xlsx")
为了能正确选出有效票,加框处代码可选的是________(单选,填字母)。
A.df["投票数"]=df.sum(axis=0)
df1=df[df["投票数"]==3]
B.df["投票数"]=df.mean(axis=0)
df1=df[df["投票数"]==1]
C.df["投票数"]=df.sum(axis=1)
df1=df[df["投票数"]==3]
D.df["投票数"]=df.mean(axis=1)
df1=df[df["投票数"]==1]
(2)对已选出的有效票进行处理,统计每位教授的最终得票(如图b所示)。将各个教授的选票数从高到低进行排序,部分代码如下,请在划线处填入合适的代码。
df2=df1.T
#仅将教授的名称与得票总数保存到DataFrame对象df2中,代码略
df2=df2.sort_values("______",ascending=False,ignore_index=True)
(3)根据得票数,选出得票数最高的3位教授(如出现第3名相同票数时,也将相同票数的教授都选出,并交给评审委员会最终投票决定)。绘制出如下柱形图,实现该功能的程序如下:
x=df3.教授
y=________
plt.bar(x,y)
#设置图表各项参数,代码略
①划线处代码为________。
②加框处代码正确选项是________(多选,填字母)。
A.df3=df2[df2.得票数>=df2.at[2,"得票数"]]
B.df3=df2[df2.得票数>=df2.at[3,"得票数"]]
C.df3=df2[df2.得票数>=df2.values[2][1]]
D.df3=df2[df2.得票数>=df2.得票数[3]]
答案 (1)C (2)得票数 (3)①df3.得票数或df3["得票数"] ②AC
解析 (1)先把每张选票的投票数计算出来,然后再筛选出投票数为 3 的有效选票。(2)筛选出的有效选票转置处理后得到图 b,按照“得票数”为关键字进行降序排序。(3)①图表的横轴是教授名称,纵轴为得票数。②A选项索引为 2 的得票数为第3位教授,筛选出大于等于该值的为并列第3名,都要筛选出来。B选项索引为3的是第4位教授。C选项values属性是DataFrame对象, df2.values[2][1]表示第3个元素的第2个数据项。
5.高一年级(9个班级)进行“七选三”预选科。每个班一个Excel文件(如图a所示)存储预选科数据。数据表中“1”代表学生选择该科目,空白代表学生未选择该科目(某班部分选科数据如图b所示)。请回答下列问题。
(1)定义如下函数check(dfs)检查选考科目数是否有误,其中参数dfs为DataFrame对象,由如图b所示Excel数据导入。返回值erlst为列表,列表元素数据类型为整型,表示错误数据行对应的学生序号(例如第6行学生“戴*跃”的序号为5)。
def check(dfs):
 erlst=[]
 for i in range(len(dfs)):
   xk_sum=0
   for j in dfs.columns[2:]:
    dyg=①________
    if dyg==1:
      xk_sum+=dyg
  if xk_sum!=3:
    erlst.append(②__________)
return erlst
①在程序中划线处填入的正确代码为________(单选,填字母)。
A.dfs.at['i','j'] B.dfs.at['j','i']
C.dfs.at[i,j] D.dfs.at[j,i]
②在程序中划线处填入合适的代码。
(2)读取每个班级的Excel选科数据,若检查无误,则统计每个班级同时选报“物理”和“化学”学科的人数,存储在字典ans中。实现该功能的Python程序如下:
import pandas as pd
ans={}
for i in range(1,10):
 filename=str(i)+'. xlsx'
 df=pd.read_excel(filename)
 errlist=check(df)
 if errlist!=[]:
   print("请检查文件",filename,"中序号为",errlist,"的学生")
 else:
   ①__________ #筛选同时选择物理和化学的数据记录存储在df1中
   ans[str(i)+'班']=[②__________] #形如{“1班”:[41]}
①在程序划线处应填入的正确代码段为________(多选,填字母)。
A.df1=df[df['物理']==1] 
df1=df1[df1['化学']==1]
B.df1=df[df['物理']==1]
df1=df[df['化学']==1]
C.df1=df[df['化学']==1]
df1=dfl[df1['物理']==1]
D.df1=df[df['化学']==1]
df1=df[df['物理']==1]
②在程序划线处填入合适的代码。
(3)用字典ans创建并转置的DataFrame对象如图c所示,绘制柱形图如图d所示。实现该功能的Python程序如下:
import matplotlib.pyplot as plt
adf=pd.DataFrame(ans,index=['人数']).T
plt.bar(________)
#设置绘图参数,代码略
plt.show()
程序的划线处应填入的正确代码为________(单选,填字母)。
A.adf.人数,adf.班级 B.adf.班级,adf.人数
C.adf.人数,adf.index D.adf.index,adf.人数
答案 (1)①C ②i+1 (2)①AC ②len(df1)或len(df1.index) (3)D
解析 (1)①函数check检查选考科目数是否有误,变量i表示学生所在行索引,j表示列的名称,因此用变量dfs.at[i,j]表示某个单元格的名称。②函数返回错误数据行对应的学生序号,序号为行索引i加1。(2)①先筛选出选物理的学生记录,保存在对象df1中,再在df1中筛选出选化学的学生;或者先筛选出选化学的学生记录,再筛选出选物理的学生记录。②统计每个班级同时选报“物理”和“化学”学科的人数,而该人数就是对象df1的记录的数量len(df1)。(3)利用字典ans创建对象adf,字典的键为各个列标题的名称,值为每一行的记录值,该对象只有一行记录,且设置index为人数。转置是对行列发生变换,一共有10行,对应的属性是index,只有一列,列的标题是人数。
6.土质监测系统已采集了大棚一年的土壤湿度数据,该大棚土壤湿度的正常范围为60-80(单位:%)。现要对这些数据进行分析,请回答下列问题:
(1)将监测系统的数据导出,存于humdata.xlsx文件中,如图a所示。现要找出6月份土壤湿度超出正常范围次数最多的监测点,并统计该监测点6月份土壤湿度超出正常范围的日分布情况,绘制如图b所示的柱形图。实现上述功能的部分Python程序如下,请选择合适的代码填入划线处(单选)。
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel("humdata.xlsx")
df1=df[df.月==6]
df2=df1[(df1["湿度"]<60)|(df1["湿度"]>80)] #筛选df1中湿度值超出正常范围的数据
df_g=①__________
df_sort=②__________
#将df_sort首行的监测点存入p,代码略
df3=③________
df3_g=df3.groupby("日",as_index=False).count()
plt.bar(df3_g["日"],df3_g["湿度"])
#设置绘图参数,显示如图b所示的柱形图,代码略程序中①②③处可选的代码有:________。
A.df1[df1.监测点==p]
B.df2[df2.监测点==p]
C.df_g.sort_values("湿度",ascending=True)
D.df_g.sort_values("湿度",ascending=False)
E.df2.groupby("监测点",as_index=False).sum()
F.df2.groupby("监测点",as_index=False).count()
(2)将6月某监测点的土壤湿度数据存储于列表data中,要求找出其中长度为5的连续子序列,使得该子序列的所有湿度值均在正常范围内,且其平均湿度最大(若存在多个,则选择最早出现的子序列),并输出该子序列的平均湿度值及其起始下标(保证至少存在一个有效解)。实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
#读入土壤湿度数据,按采集的时间顺序存储于列表data中,代码略
max=-1
count=sum=0
for i in range(5):
 sum+=①________
 if not (60<=data[i]<=80):
   count+=1
if count==0:
 max=sum
 start=0
i=1
while i<=len(data)-5:
 sum-=data[i-1]
 if not(60<=data[i-1]<=80):
   count-=1
 ②________
 if not(60<=data[i+4]<=80):
   count+=1
 if ③__________:
   max=sum
   start=i
 i+=1
print("最高平均湿度值:"+str(max/5)+",起始下标:"+str(start))
答案 (1)①F ②D ③B (2)①data[i]  ②sum+=data[i+4] 
③count==0 and sum>max
解析 (1)要找出6月份土壤湿度超出正常范围次数最多的监测点,并统计该监测点6月份土壤湿度超出正常范围的日分布情况。①先按监测点分组统计每个监测点超出正常范围的次数。②再按湿度降序排序。③最后在湿度值超出正常范围的数据df2中筛选出监测点为p的数据。(2)①模块for i in range(5)的作用是统计data中前5个元素的情况,统计前5个数据的总和sum以及非正常数据的个数count,如果没有不正常的,那么最大值更新为sum。②循环变量i从1开始,遍历到len(data)-5,每段去除i-1位置的数据,加入i+4的数据,实现不断向后滑动遍历5个数据。每段的5个数据为从索引i至i+4,从sum中先减去data[i-1],再加上新数据data[i+4],就是每段的总和。③若data[i-1]属于非正常数据,那么在新的一段中,count的值将要减去1;若数据data[i+4]n属于非正常范围,那么count的值将要加1。若count的值为0且sum大于max,就是符合条件最大长度。

展开更多......

收起↑

资源列表