2025届高中信息技术二轮复习 第二部分 算法与程序设计 专题9 pandas数据统计(课件 学案)

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

2025届高中信息技术二轮复习 第二部分 算法与程序设计 专题9 pandas数据统计(课件 学案)

资源简介

专题9 pandas数据统计
学习目标 
1.对DataFrame对象按列进行公式计算,描述DataFrame对象数据以字典中键为列的存储形式;
2.对每个键对应一列数据多个值进行切片,掌握取出不同数据区域内容的方法;
3.运用函数统计对象的平均值等操作,运用排序函数对数据进行有序排列;
4.运用groupby函数对数据进行分组的方法,并在分组的基础上进行数据统计.
Pandas有Series和DataFrame两种对象,这两种对象均有index和values属性,Series对象的values是一维的,DataFrame的values是二维的,因此DataFrame对象比Series对象多一个columns属性,可以理解为index表示行号,columns表示列名。pandas处理的对象主要是DataFrame,取出DataFrame中的一列,降维为Series对象,可以用list函数转换为列表,对某列的值进行切片,可以转换为一个数值。可以对记录选取、筛选和分组操作,灵活地区分不同类型的数据,可以对记录进行排序操作,实现数据的有序显示。可以对各条记录的字段进行遍历,统计符合要求字段值的数量、总和、平均值以及最值。
(2024年1月浙江省选考)某学院举行运动会,比赛设跳高、100米等项目,每个项目分男子组和女子组。现要进行报名数据处理和比赛成绩分析。请回答下列问题:
 
(1)运动会报名规则为:对于每个项目的男子组和女子组,每个专业最多各报5人(如“软件工程”专业在男子跳高项目中最多报5人)。软件工程专业的报名数据保存在DataFrame对象df中,如图a所示。若要编写Python程序检查该专业男子跳高项目报名是否符合规则,下列方法中,正确的是________(单选,填字母)。
A.从df中筛选出性别为“男”的数据dfs,再从dfs中筛选出项目为“跳高”的数据,判断筛选出的数据行是否超过5行
B.对df中数据按性别排序并保存到dfs中,再从dfs中筛选出项目为“跳高”的数据,判断筛选出的数据行是否超过5行
C.从df中筛选出项目为“跳高”的数据dfs,判断dfs中是否有连续5行以上的男生数据
(2)运动员比赛成绩的部分数据如图b所示。根据已有名次计算得,第1名至8名分别计9,7,6,5,4,3,2,1分,第8名之后计0分。实现上述功能的部分Python程序如下,请在程序中划线处填入合适的代码。
import pandas as 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 利用Pandas批量处理文件
Pandas主要功能是计算一个集合对象中某个字段的记录数量、总和、平均值和最值(最大值或最小值)。这个集合可以是通过筛选找到符合处理条件的数据(子集),也可以是通过分组,将某列相同字段值的记录组合在一起,形成一个个的分组,再分别统计各个分组的数量、和、平均值和最值。这些功能Excel软件也可以实现,但若是数据分布在多个数据文件时,Excel软件就要手工不断地打开数据,重复进行统计,而Pandas可以通过算法,利用循环结构,将这些操作让计算机自动完成。
例题 小红收集了部分城市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)城市A 2021年PM2.5年平均浓度为34.6微克/立方米。由图c可知,城市A 2021年PM2.5月平均浓度超过年平均浓度的月份共________个。
变式 学校食堂以服务质量进行了调查问卷,调查项目共 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()
重难点2 利用函数按列进行数据统计
DataFrame是Pandas处理的主要对象,index属性记录了每行记录所在的行索引,columns属性记录每列的名称。df.列名就可以表示该列所有的数据的集合,可以运用函数计算一个集合对象的记录数量、总和、平均值和最值(最大值或最小值)。通过筛选找到符合处理条件的数据(子集)集合,再对集合进行求和等计算。通过分组,将某列相同字段值的记录组合在一起,形成一个个的分组,再分别统计各个分组的数量、和、平均值和最值。
例题 小明通过调查问卷收集了食堂满意度情况数据,保存在“data.csv”文件,如图a所示。
图a
图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()
变式 某学校开设选修课并在期末让学生对其进行满意度调查,选修课分艺术、体育、语言、计算机、职业技能等领域。现要进行报名数据处理和满意度分析, 请回答下列问题:
图a
图b
(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 利用Pandas批量处理文件
1.高一年级(9个班级)进行“七选三”预选科。每个班一个Excel文件(如图a所示)存储预选科数据。数据表中“1”代表学生选择该科目,空白代表学生未选择该科目(某班部分选科数据如图b所示)。请回答下列问题。
图a
图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]}
①在程序划线处应填入的正确代码段为________(多选,填字母)。(注:全部选对的得 2 分,选对但不全的得1分,不选或有选错的得 0 分)
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.人数
2.学校暑期开展“青春迎亚运”活动,邀请高二学生每日参加运动锻炼并进行线上打卡。每周收集一次相关数据,分别保存在相应的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
3.为统计分析不同年级学生名字中的常用字,小王同学收集了本校所有学生的名字,并以入学年份为文件名分别保存在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()
4.小明利用“在线社团报名系统”收集了全校学生的社团报名信息,并将报名数据导出到“社团报名.xlsx”中,如图a所示。然后编写Python程序对报名数据进行处理,生成分别以班级名和社团名为文件名的Excel文件,以便分发给相应的社团指导老师和班主任。
图a
图b
(1)在对表格进行数据整理时发现,关于“Jacky.Y”同学的记录可能存在的数据问题是________(选填:A.数据缺失 B.数据异常 C.逻辑错误 D.数据格式不一致)。
(2)其中生成每个社团名单文件的过程是:先对报名数据按社团名称进行分类,并对选报同一社团的学生按班级进行升序排序,然后生成各个社团名单文件,如图b所示。对应的程序代码如下,请在划线处填写合适的代码。
import pandas as pd
def read_file(filename):
  #读入报名数据的原始文件,并将表中的数据转换成列表,代码略
def save_file(a): #保存名单到相应社团的Excel电子表格文件
  df = pd.DataFrame(a,columns=[″班级″,″姓名″,″选报社团″])
  df.to_excel(①________+″.xlsx″,index=False)
a = read_file(″社团报名.xlsx″)
n = len(a)
#按社团名(参照拼音的字母顺序)进行升序排序,代码略
#统计各社团人数,存在列表rs中,rs=[[“滑板社”,36],…],代码略
a=[];imin=0;k=0
s = 0
for i in range(len(rs)):
  ②________
  left,right = s, s+num-1
  while left < right:
    imin = imax = left
    for k in range(left+1,right+1):
    if a[k][0]      imin=k  
    elif a[k][0]>a[imax][0]:
      imax = k
    if imin != left:
      a[imin],a[left] = a[left],a[imin]
    if imax == left:
      ③________
      if imax != right:
         a[imax],a[right] = a[right],a[imax]
   left = left + 1; right = right-1
   ④________
   s += num
重难点2 利用函数按列进行数据统计
1.某单位根据全省各县市区的公共设施与服务运行情况,编制了“公共服务惠民指数”与“公共设施匹配指数”,现要对该两项指数进行分析。请回答下列问题:
图a
图b
(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
2.某校高一学生的社团报名数据存储在“stbm.xlsx”文件中,如图a 所示。
{'书画社':52,'动漫社':97,'摄影社':35,'汉学社':38,'法学社':51,'诗词社':37,'辩论社':43,'音乐社':63,'飞羽社':56,'魔方社':29}
图c
(1)统计各社团报名人数,找出报名人数最多的三个社团(不存在并列名次情况)并创建如图b所示的图表。实现上述功能的 Python 程序如下,请在划线处填入合适代码。
import pandas as pd
import matplotlib.pyplot as plt
#设置中文字体,代码略
df=pd.read_excel(″stbm.xlsx″)
df1=df.groupby(″①__________″,as_index=False).count()
#删除df1的“班级”列,并将列标题“姓名”重命名为“人数”,保存修改结果,代码略
df2=df1.sort_values(″人数″,ascending=False)
df3=df2.②________
plt.bar(df3.社团,③________)
plt.title(″报名人数最多的前三个社团″)
plt.show()
#将各社团报名人数存入字典stdic并输出,结果如图c所示,代码略
(2)受场地限制,每个社团开展活动人数上限为45人。解决方案:超过45人的社团分成若干班级,每班人数按一定规则分配。编程解决社团分班问题,并输出如图d所示分班方案,请在划线处填入合适代码。
{'书画社':[26,26],'动漫社':[32,32,33], '摄影社':35,'汉学社':38,'法学社':[25,26], '诗词社':37,'辩论社':43,'音乐社':[31,32], '飞羽社':[28,28],'魔方社':29}
图d
for i in stdic:
  if stdic[i]>45:
  n=(stdic[i]-1)∥45+1
  num=[]; x=stdic[i]∥n
  for j in range(n):
    if j==n-1:
    num.append(________)
    else:
     num.append(x) #将x添加到列表num末尾
  stdic[i]=num
print(stdic)
(3)若“动漫社”实际报名人数为98人,则利用上述程序段进行分班后得到的结果为__________________________________________________________________
(单选,填字母:A.'动漫社':[32,33,33]/B.'动漫社':[32,32,34])。
3.小温对 5 个景区进行网络问卷调查,问卷中“环境”“硬件”“服务”和“交通”设置的选项及分值均一致,部分界面如图a所示。导出数据的部分界面如图b所示,其中数字对应问卷中每题的选项,如数字 i 代表该题的第 i个选项。请回答下列问题。
(1)若要统计每份问卷对应景区的评分, 部分代码如下:
#导入相关模块,读取如图b所示的数据,保存到DataFrame对象df中,代码略
qz=[2.5,2,1.5,1,0.5]  
________
则划线处的代码为________(单选,填字母)
A.df[″评分″] = qz[df[″环境″]] + qz[df[″硬件″]] + qz[df[″服务″]] + qz[df[″交通″]]
B.df[″评分″] = df[[″环境″,″硬件″,″服务″,″交通″]].sum (axis=1)
C.df[″评分″] = 0
for i in df.index:
  a= df.at[i,″环境″]; b= df.at[i,″硬件″]
  c= df.at[i,″服务″]; d= df.at[i,″交通″]
  df.at[i,″评分″] = qz[a-1]+qz[b-1]+qz[c-1]+qz[d-1]
(2)找出18~39 岁年龄段游客评分均值最高的景区,请在划线处填入合适的代码。
jq=[″雁荡山″,″楠溪江″,″渔寮″,″南麂列岛″,″氡泉″]
df1 = df[①________]
df2 = df1.groupby(″景区″, as_ index=False)[″评分″].mean()
df2 = df2.sort_values(″②________″, ascending=False)
print(jq[df2[″景区″][0]-1])
(3)根据上述 df2 中的评分数据, 绘制如图 c 所示的垂直柱形图, 代码如下:
#导入相关模块, 代码略
jq1 = []
ave = df2[″评分″].mean()
df2[″均差″] = df2[″评分″] - ave
for i in df2.index:
  jq1.append (jq[df2.at[i,″景区″] - 1])
plt.bar(x, y)
plt.show()
程序加框处的应填入的正确代码为________(单选, 填字母)。
A.x=jq
y=df2[″评分″]
B.x=df2[″景区″]
y=df2[″均差″]
C.x=jq1
y=df2[″均差″]
4.张三同学收集了一个地区 8 月各类共享单车的骑行数据记录,每天的用户数据存储于“shared_bikes.xlsx”文件中,不考虑跨天数据。数据格式如图a所示,请回答下列问题:
(1)cal 函数功能为:读取骑行时间的小时和分钟部分,转换为分钟格式并返回,如“2022/8/20 6:57”获取“6:57”转换为417(6*60+57=417),代码如下。请在划线处填入合适的代码。
def cal(s):
  n = len(s)
  for i in range(n):
  if s[i] ==″″: #如果为空格字符
    p = i
  if s[i] ==″:″:
    q = i
  t =________ + int(s[q+1:])
  return t
(2)统计本月各类型单车的每天平均骑行时长,并绘制柱形图,代码如下,绘制的图表如图b所示,请在划线处填入合适的代码。
图b
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel(″shared_bikes.xlsx″)
bike = [″哈罗单车″,″摩拜单车″,″美团单车″,″青桔单车″]
sm = [0] * 4
avg = [0] * 4
days = 31
for i in ①________:
  t = cal(df.at[i,″结束时间″]) - cal(df.at[i,″开始时间″])
  for j in range(len(bike)):
  if df.at[i,″APP类型″] == bike[j]:
    ②________
    break
for i in range(len(bike)):
  avg[i] = sm[i] / days
plt.figure(figsize = (12,4))
x = bike
y =③________
plt.bar(x,y)
plt.show()
(3)统计本月各类型单车的骑行次数,下列加框处代码有错,可以改正为________(选填字母:(A.max()/B.min()/C.mean()/D.count())
n = df.groupby(″APP 类型″, as_index = True).用户编号.
重难点1 利用Pandas批量处理文件
1.管理员从该停车系统中导出了 3 月份每天的停车记录,如图a 所示,每天的停车记录内容格式如图b 所示(进出标记为 0 表示驶入,1 表示驶出,停车记录已按进出时间升序排列)。
图a
车牌 进出时间 进出标记
川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 为该车牌当天的进出时间记录。函数代码如下,请回答下列问题:
①程序段中加框处应填入的代码为________(单选,填字母)。
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
②请在程序段划线处填入合适的代码。
def catime(t1,t2):
  #计算时间t1 与时间 t2 之间的时间差并计算本次停车的费用,函数返回停车费用,代码略。
def readdata(data):
  m=len(data)
  p=0;cost=0;total=0
  while p  if :
     cost=catime(data.进出时间[p],data.进出时间[p+1])
     total+=cost
     p+=1
   ②________
  return total
(2)统计停车场 3 月份每天的收入并绘制柱形图,部分Python代码如下,请在划线处填入合适的代码。
n=31;dic={}
for i in range(1,n+1):
  ①________
  fname=″3 月″+str(i)+″日.xlsx″
  df=pd.read_excel(fname)
  df_g=df.groupby(″车牌″).进出标记.count()
  for k in df_g.index:
  #只有一条驶入或驶出记录的车辆不参与计费
  if ②________:
    data=df[df.车牌==k]
    dic[i]+=readdata(data)
plt.title(″某停车场3月份整体收入图″)
plt.bar(dic.keys(),dic.values())
plt.show()
(3)已知每月分为3个时间段,1-10日称为上旬,11-20日称为中旬,21-30(31)日称为下旬。则由图c可知,该停车场3月份________(选填:上旬/中旬/下旬)收入总和最高。
2.小明为了研究某地近十年每月的温差变化,编写Python程序。以2023年4月为例,该月每天的温度数据分别保存在以8位日期字符串命名的excel文件中,部分文件如图a所示,每个文件记录了一天24小时的温度数据,如图b记录了4月28日的数据。
图a
图b
(1)定义dv函数,功能为:读取某天的excel文件,返回当天最高温度与最低温度的差值。函数代码如下,划线处应填入的代码为________(单选,填字母)。
A.df[″温度″].head(1)-df[″温度″].tail(1)
B.df[″温度″].(max()-min())
C.df[″温度″].max()-df[″温度″].min()
D.df[″温度″].(head(1)-tail(1))
def dv(dayfile):
  df=pd.read_excel(dayfile)
  diff=____________
  return diff
(2)定义find函数,功能为:用字典创建DataFrame对象,并筛选出4月份温差大于13的日期,输出结果如图c所示,请在划线处填入代码。
日期 温差
3 0404 13.1
9 0410 13.1
15 0416 13.3
17 0418 13.8
27 0428 15.5
图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))
3.小美收集了某电商平台某年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所示
图c
(3)由图c可知,该空调销售额增量最大的月份是________。
4. 一球迷收集了近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)
5.李老师收集了 2022 级学生“七选三” 选课意愿数据,每个班的数据分别保存以'xk'+班级为命名的 xlsx 文件中,如图a所示,每个文件记录了该班每位学生的选考科目选课情况,如图b所示。
为统计分析全年级“七选三”选课意愿数据,编写 Python 程序,请回答下列问题:
(1)读取各班 xlsx 文件,并合并到一个 DataFrame 对象。程序代码如下,请在划线处填入合适的代码。
def data(i):
  i=i+1
  if ①________:
  t='0'+str(i)
 else:
  t=str(i)
 df_t=pd.read_excel('xk'+t+'.xlsx')
 return df_t
n=12
df=pd.DataFrame()
for i in range(n):
 df=df.append(②________,ignore_index=True) #在df末尾追加一个DataFrame
(2)统计“技术”选课人数占总人数的比例,并作出各个科目选课人数的柱形图。程序代码如下,请在划线处填入合适的代码。
图c
km={'物理':0,'化学':0,'生物':0,'政治':0,'历史':0,'地理':0,'技术':0}
for i in range(len(df)):
  xk=df['选课'][i].split(',')  #将'选课'字符串以逗号分隔出来
  for j in xk:
  ①________
print('选考技术占比: '+str(round(②________*100,2))+'%')
df_km=pd.DataFrame({'科目':km.keys(),'人数':km.values()}) #转换为 DataFrame
plt.title('选考各科目人数对比图')
plt.bar(③________,df_km['人数'],label='各科目人数')
plt.legend()
plt.show()
(3)分析图c可知,选课人数最多的三门科目是________________。
6.某同学收集了部分城市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()
重难点2 利用函数按列进行数据统计
1.某竞赛获奖名单已公布,现要对获奖情况进行数据处理和分析。请回答下列问题:
 
           图a             图b
(1)将获奖名单读取到DataFrame对象df中,如图a所示,若要编写Pandas程序分析出浙江省内获得满分400分的总人数。下列方法正确的是________(单选,填字母)。
A.从df中筛选出省份为“浙江”的数据df1,再从df1中筛选出总分为“400”的数据df2,最后对df2中的“姓名”数据列使用count()函数统计出总人数
B.对df中数据按“总分”降序排列并保存到df1中,再从df1中筛选出省份为“浙江”的数据df2,最后对df2中的“姓名”数据列使用sum()函数统计出总人数
C.对df中数据按“总分”为关键字进行分组,并使用count()函数统计出总人数,得到数据df1,再从df1中筛选出省份为“浙江”的总人数
(2)提取获奖名单中的部分数据列,结果如图b所示。小陆想统计各省份一等奖获奖学生的准考证号,存储在字典dic中,h为一等奖获奖分数线。实现上述功能的部分python程序如下,请在划线处填入合适的代码。
import pandas as pd
#读取如图b所示数据,保存到DataFrame对象df中,代码略
#将DataFrame对象df转换为列表lst,代码略
#列表lst的值为[[″北京″,″BJ-0032″,400],…,[″江苏″,″JS-0009″,350],[″四川″,″SC-0003″,384]]
h = int(input(″输入一等奖获奖分数线″))
i = 0
s =″″
dic = { } #字典 dic 中的键为省份名称,值为一等奖获奖学生的准考证号
while i < len(lst):
  if ①________:
  city = lst[i][0]
  if city in dic :
     dic[city] +=″,″+lst[i][1]
  else:
     ②____________
  i += 1
(3)获奖名单新增“获奖等级”数据列,存储在文件“data.xlsx”,如图c所示,小陆想分析出一等奖获奖人数最多的前5个省份(没有并列情况),并绘制如图d所示的柱形图,实现该功能的部分Python程序如下。
 
图c
图d
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams[″font.sans-serif″] = [″SimHei″] #设置图表显示中文字体
df = pd.read_excel(″data.xlsx″)
df1 =①________ #选取相应的一等奖数据
df2 = df1.groupby(″省份″).count() #分组统计总人数
df2.rename(columns = {″姓名″:″获奖人数″}, inplace = True) #更改列标题名称
g = df2.sort_values(″获奖人数″, ascending = False).head(5)
plt.title(″一等奖获奖人数最多的前 5 个省份″)
plt.bar( ②________ ) #绘制柱形图
plt.ylabel(″获奖人数″)
plt.show()
①请在程序中划线处填入合适的代码。
②程序的划线处中应填入的正确代码为________(单选,填字母)。
A.g.省份,g.获奖人数 B.df2[″省份″],df2[″获奖人数″]
C.g.index,g.获奖人数 D.df2.index,df2.获奖人数
2.为了督促学生寒假坚持体育锻炼,老师采用线上打卡的方式收集学生锻炼情况,数据如图a所示。
图a
图b
为统计冬锻完成情况,编写 Python 程序。请回答下列问题:
(1)定义outdata函数,其中参数dftmp是DataFrame数据类型,数据由图a所示的Excel表导入。函数功能是:统计每天每个学生的锻炼项目个数,返回含有“学籍号”、“姓名”和“项目个数”信息的二维列表。
函数代码如下,划线处应填入的代码为________(多选,填字母)。
A.dftmp.at[i,j]==″√″
B.dftmp[i][j]==″√″
C.dftmp.at[j,i]==″√″
D.dftmp[j][i]==″√″
def outdata(dftmp):
  a=[]
  for i in dftmp.index: #dftmp 的行索引
  itemn=0
  for j in dftmp.columns[4:]: #dftmp 中从“跑步”开始的列标题
    if ______________ :
       itemn+=1
  a.append([str(df[″学籍号″][i]),df[″姓名″][i],itemn])
  return a
(2)冬锻打卡成功的标准为累计运动 15 天,每天锻炼项目达到 3 项及以上。统计输出寒假体育锻炼达标的学生名单,并制作四个项目的运动次数对比图,部分界面如图b和图c所示。部分Python程序如下,请在划线处填写合适的代码。
图c
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel(″sport.xls″)
lst=outdata(df)
print(″冬锻打卡成功名单:″)
i=0;flag=[False]*len(lst)
while i  if:
  xjh=lst[i][0]
  flag[i]=True
  ①________
  for j in range(i+1,len(lst)):
    if lst[j][0]==xjh and lst[j][2]>=3:
     flag[j]=True
      days+=1
  if days>=15:
print(lst[i][0]+″/″+lst[i][1]+″/″+str(days)+″天″)
  ②________
ydl=df.count() #统计各列非空单元格数量,结果为Series
item=[″跑步″,″跳绳″,″俯卧撑″,″仰卧起坐″]
nums=③________
plt.bar(item,nums,label=″运动次数″)
(3)程序加框处代码有错,请改正。
3.小帅收集了2023年的销售数据并存储在″超市销售数据.csv″文件中,部分数据如图a所示。分析某月的销售情况,柱形图如图b所示。部分Python程序如下:
顾客编号,大类名称,销售日期,小类名称,商品类型,单位,销售数量,商品单位,销售金额 5,粮油,20230101,番茄酱,一般商品,瓶,1,6.7,6.7 10,日配,20230101,冷藏果粒酸乳,一般商品,盒,1,8.9,5.9 26,冲调,20230101,麦片/粉,一般商品,袋,1,27.7,27.7 31,洗化,20230101,洗衣皂,一般商品,块,1,4.9,4.9 31,洗化,20230101,软抽纸巾,一般商品,提,1,9.7,6.9 49,蔬果,20230101,花果,生鲜,千克,0.902,9.96,8.98 8,日配,20230101,利乐砖纯奶,一般商品,提,1,65,49 15,家居,胶棉拖把,一般商品,把,1,70,70 50,休闲,20230101,软糖,一般商品,袋,1,10.9,10.9 1,蔬果,20230101,芽菜,生鲜,千克,0.456,2.78,1.27 5,蔬果,20230101,鲜调味,生鲜,千克,0.24,9.6,2.3 2,洗化,20230101,无芯纸,一般商品,提,1,24.9,18.9 9,休闲,20230101,趣味/休闲,一般商品,盒,1,6.9,6.9 46,蔬果,20230101,苹果类,生鲜,千克,1.776,4.98,8.84
图a
图b
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_csv(″超市销售数据.csv″) #读取文件中的数据
df.insert(0,″月份″,″″) #插入列
for i in(1)________:
  data=str(df.at[i,″销售日期″]) #通过行标签和列标签选取单个值
  df.at[i,″月份″]=data[4:6]
m=int(input(″请输入需查询的月份:″))
if m>=10:
  month=str(m)
else:
  month=″0″+str(m)
g=df[①________] #筛选月份数据
g=g.groupby(″大类名称″,as_index=False)[″销售金额″].sum() #分组求和
g=
x=g[″大类名称″]
y=②________
plt.bar(x,y) #绘制柱形图
#设置绘图参数,显示如图b所示的柱形图,代码略
请回答下列问题:
(1)为提取“销售日期”中月份数据,划线处应填入的代码是________(单选,填字母)。
A.df.index B.df.values C.df.columns
(2)请在程序中划线①②处填入合适的代码。
(3) 加框处实现按“销售金额”降序排列后取前10项,下列代码中能正确实现的有________(多选,填字母)。(注:全部选对的得2分,选对但不全的得1分,不选或有选错的得0分)
A.g.sort_values(″销售金额″,ascending=False).tail(10)
B.g.sort_values(″销售金额″,ascending=False).head(10)
C.g.sort_values(″销售金额″,ascending=True)[:11]
D.g.sort_values(″销售金额″,ascending=False)[:10]
4.小陈在气象部门得到了一份2022年不同城市的月平均日照时数(单位:kW·h/m2/day)数据,存放在Excel文件“日照.xlsx”中。部分界面如图所示。
图a
请回答下列问题:
(1)第1步,小陈编写了如下代码。
import pandas as pd
df = pd.read_excel(″日照.xlsx″)
mdays = [31,28,31,30,31,30,31,31,30,31,30,31]
months = list(df.columns)
for i in df.index :
  s = 0
  for j in range(12):
  m = df.at[i,months[j +1]]
  s += mdays [j]
  s += m*mdays[j]
  df.at[i,″年度平均″]= round(s/365,2)
该程序实现的功能是________。
(2)第2步,仅考虑平均日照时数因素,选出最适合用光伏发电给智能农业大棚提供能源的十个城市。划线处应填入的代码为________(单选,填字母)。
df=________
A.df.sort_values(″城市名″,ascending=False).head(10)
B.df.sort_values(″城市名″).tail(10)
C.df.sort_values(″年度平均″,ascending=False)[:10]
D.df.sort_values(″年度平均″,ascending=False).tail(10)
#输出结果如图b所示,代码略
年度平均最高的10个城市为: 日喀则地区 5.83 阿里地区 5.66 三沙市 5.57 山南地区 5.53 拉萨市 5.53 那曲地区 5.11 昌都地区 4.91 海西蒙古族藏族自治州 4.88 和田地区 4.84 攀枝花市 4.83
图b
(3)小陈想在家乡温州建一个智能大棚,采用光伏发电加蓄电设备供电,面积为1平方米的光伏板容量约为0.3 kW/块,光伏的充放电效率为80%,大棚每天消耗的最低电能约为30 kW·h,为确保每月能正常供电,需要1平方米的光伏发电板共①________块。(日均发电量=电池板的容量/块×块数×平均日照时数×充放电效率)
建设光伏发电设备前要先获得当地的平均日照时数情况,小陈通过如下代码获取相关数据。程序运行界面如图c所示:
图c
res=df[df[″城市名″]==″温州市″]
res=res.values[0][1:13].②________
print(″温州市月平均日照最小值为”,res)
5.小周要统计高二年级各班的行为规范得分情况,部分扣分数据如图a所示。
图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
图b
(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()
6.某中学“7选3”选考科目的选科数据存储在Excel文件“选科数据.xlsx”中,部分数据及格式如图a所示。图中“1”表示选择该科目为选考科目。现对数据进行统计分析,编写Python程序,请回答下列问题。
图a
(1)定义fenban函数,功能为:根据选考科目选报的总人数allrs及该科目最大班额maxbrs,计算需开设的班级数。函数代码如下,请在划线处填入合适的代码。
def fenban(allrs,maxbrs):
  bjnum=allrs∥maxbrs
  if ________________:
  bjnum+=1
  return bjnum
(2)统计7选3各科的选报人数,输出各科的选报情况及开班情况,如图b所示。部分程序代码如下,请在划线处填入合适的代码。
物理 人数:398 班级数:10 化学 人数:408 班级数:11 生物 人数:133 班级数:4 政治 人数:261 班级数:7 历史 人数:244 班级数:7 地理 人数:361 班级数:10 技术 人数:136 班级数:4
图b
import pandas as pd
df=pd.read_excel(″选科数据.xlsx″)
km=[″物理″,″化学″,″生物″,″政治″,″历史″,″地理″,″技术″]
m=40 #每个班的最多人数,班额
bj=[0]*7
xkrs=[0]*7 #存储选考科目的选报人数
p=0
for j in km:
  __①________
  for i in range(len(df)):
  if df.at[i,j]==1:
    cnt+=1
  ②________
  bj[p]=fenban(cnt,m)
p=p+1
for i in range(7):
  print(km[i],″人数:″,xkrs[i],″班级数:″,bj[i])
(3)绘制选考科目选科人数情况的柱形图,部分Python程序如下,请在划线处填写合适的代码。
import matplotlib.pyplot as plt
x=km
y=__________________
plt.bar(x,y)#绘制柱形图
#设置绘图参数,显示如图c所示柱形图,代码略
图c
(4)下列程序能实现按班级统计各班选报技术学科人数的是________(单选,填字母)。
A.jsrs_bj=df.groupby(″班级″).″技术″.count()
B.jsrs_bj=df.sort_values(″班级″).count()
C.jsrs_bj=df.groupby(″班级″)[″技术″].count()
D.jsrs_bj=df.groupby(″班级″).技术.mean()
7.第19届杭州亚运会已完美落幕,亚运会赛事以“杭州为主,全省共享”的原则分布在杭州、宁波、温州、湖州、绍兴、金华各地。大会共有40个大项,61个分项,最终诞生了481块金牌。小李作为一名体育爱好者想重温大会赛程安排,他从杭州亚运会的官网上采集了相关数据,整理后存储在“杭州第19届亚运会总赛程.xlsx”文件中。如图a所示(0表示有赛事但不产生金牌,其他数字表示当天产生的金牌数)。
图a
为了更清楚地了解相关赛事信息,小李编写了Python程序,请回答以下问题。
(1)足球是小李最关注的大项,为了解足球的赛程安排,划线处应填入的代码为________(单选,填字母)
A.df.大项==″足球″ B.df[″大项″==″足球″]
C.df[df.大项==″足球″] D.df[df[″大项″]==足球]
import pandas as pd
df=pd.read_excel(″杭州第 19 届亚运会总赛程.xlsx″)
df2=________
print(df2)
(2)足球项目的比赛分布在杭州等城市的八个场馆,了解各个场馆举办足球赛事的具体场次,找到连续举办足球赛事最多的场馆,如图b所示。程序代码如下,请在划线处填入合适的代码。
黄龙体育中心体育场 [9/19, 9/21, 9/24, 9/27, 9/28, 10/1, 10/4, 10/6, 10/7] 临平体育中心体育场 [9/19, 9/21, 9/22, 9/24, 9/25, 9/28, 9/30, 10/3] 上城体育中心体育场 [9/20, 9/22, 9/24, 9/25, 9/27, 9/28, 10/1, 10/3, 10/7] 萧山体育中心体育场 [9/19, 9/20, 9/21, 9/22, 9/24, 9/25, 9/27, 9/28, 10/1, 10/4] 金华体育中心体育场 [9/19, 9/21, 9/24, 9/27] 浙江师范大学东体育场 [9/19, 9/21, 9/24, 9/27] 温州奥体中心体育场 [9/21, 9/22, 9/24, 9/25, 9/27, 9/28, 9/30] 温州体育中心体育场 [9/22, 9/24, 9/25, 9/27, 9/28, 9/30] 连续举办足球赛事最多的场馆:萧山体育中心体育场
图b
dic={}
max=0;maxsta=″″
lst=df2.竞赛场馆.tolist() #将数据转换为列表
for i in lst:
  dic[i]=[]
for i in df2.index:
  c=0
  sta=df2[″竞赛场馆″][i]
  for j in df2.columns[2:-3]:
  if df2.at[i,j]==0 or df2.at[i,j]==1:
    ①________
    c=c+1
    if c>max:
      max=c;maxsta=sta
  else:
    __②________
for i in dic:
  print(i,dic[i])
print(″连续举办足球赛事最多的场馆:″,③________ )
(3)足球在亚运会期间总共产生两枚金牌,统计分析其他大项产生的金牌总数,找出产生金牌总数最多的十个大项,并绘制图形如图c所示。程序代码如下,请在划线处填入合适的代码。
图c
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['simhei'] #图表中文标签显示为黑体
grp=df.groupby(①________ , as_index=False).金牌总数.sum()
grp=grp.sort_values(″金牌总数″,ascending=False).②________
x=grp.大项
y=grp.金牌总数
#设置图表参数,代码略。
专题9 pandas数据统计
学习目标 
1.对DataFrame对象按列进行公式计算,描述DataFrame对象数据以字典中键为列的存储形式;
2.对每个键对应一列数据多个值进行切片,掌握取出不同数据区域内容的方法;
3.运用函数统计对象的平均值等操作,运用排序函数对数据进行有序排列;
4.运用groupby函数对数据进行分组的方法,并在分组的基础上进行数据统计.
Pandas有Series和DataFrame两种对象,这两种对象均有index和values属性,Series对象的values是一维的,DataFrame的values是二维的,因此DataFrame对象比Series对象多一个columns属性,可以理解为index表示行号,columns表示列名。pandas处理的对象主要是DataFrame,取出DataFrame中的一列,降维为Series对象,可以用list函数转换为列表,对某列的值进行切片,可以转换为一个数值。可以对记录选取、筛选和分组操作,灵活地区分不同类型的数据,可以对记录进行排序操作,实现数据的有序显示。可以对各条记录的字段进行遍历,统计符合要求字段值的数量、总和、平均值以及最值。
(2024年1月浙江省选考)某学院举行运动会,比赛设跳高、100米等项目,每个项目分男子组和女子组。现要进行报名数据处理和比赛成绩分析。请回答下列问题:
 
(1)运动会报名规则为:对于每个项目的男子组和女子组,每个专业最多各报5人(如“软件工程”专业在男子跳高项目中最多报5人)。软件工程专业的报名数据保存在DataFrame对象df中,如图a所示。若要编写Python程序检查该专业男子跳高项目报名是否符合规则,下列方法中,正确的是________(单选,填字母)。
A.从df中筛选出性别为“男”的数据dfs,再从dfs中筛选出项目为“跳高”的数据,判断筛选出的数据行是否超过5行
B.对df中数据按性别排序并保存到dfs中,再从dfs中筛选出项目为“跳高”的数据,判断筛选出的数据行是否超过5行
C.从df中筛选出项目为“跳高”的数据dfs,判断dfs中是否有连续5行以上的男生数据
(2)运动员比赛成绩的部分数据如图b所示。根据已有名次计算得,第1名至8名分别计9,7,6,5,4,3,2,1分,第8名之后计0分。实现上述功能的部分Python程序如下,请在程序中划线处填入合适的代码。
import pandas as 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)①从图表中可以看出是按″专业″进行分组;②图表横轴为专业名称,纵轴为各专业的得分情况。
重难点1 利用Pandas批量处理文件
Pandas主要功能是计算一个集合对象中某个字段的记录数量、总和、平均值和最值(最大值或最小值)。这个集合可以是通过筛选找到符合处理条件的数据(子集),也可以是通过分组,将某列相同字段值的记录组合在一起,形成一个个的分组,再分别统计各个分组的数量、和、平均值和最值。这些功能Excel软件也可以实现,但若是数据分布在多个数据文件时,Excel软件就要手工不断地打开数据,重复进行统计,而Pandas可以通过算法,利用循环结构,将这些操作让计算机自动完成。
例题 小红收集了部分城市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)城市A 2021年PM2.5年平均浓度为34.6微克/立方米。由图c可知,城市A 2021年PM2.5月平均浓度超过年平均浓度的月份共________个。
明考向 本题考查利用Pandas进行数据统计
精点拨 (1)可以通过布尔型数据选取满足条件的行。(2)计算各月份PM2.5浓度的平均值,可以累加各月的每天PM2.5浓度的平均值。变量dayfile表示每天的数据文件名,题干已经提示“每天的数据分别保存在以8位日期字符串命名的CSV文件”,调用函数pmday(dayfile) ,可以得到当天PM2.5的日平均浓度,并保存于变量sd。当月的各天PM2.5的日平均浓度需要累加起来,最后求均值。③空横坐标为月份,纵坐标为PM2.5月平均浓度,即列表pm的数据。(3)超过年平均浓度的月份为1、2、3、4、11月
答案 (1)D (2)①mdays[m] ②sm += sd ③pm (3)5
变式 学校食堂以服务质量进行了调查问卷,调查项目共 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。
重难点2 利用函数按列进行数据统计
DataFrame是Pandas处理的主要对象,index属性记录了每行记录所在的行索引,columns属性记录每列的名称。df.列名就可以表示该列所有的数据的集合,可以运用函数计算一个集合对象的记录数量、总和、平均值和最值(最大值或最小值)。通过筛选找到符合处理条件的数据(子集)集合,再对集合进行求和等计算。通过分组,将某列相同字段值的记录组合在一起,形成一个个的分组,再分别统计各个分组的数量、和、平均值和最值。
例题 小明通过调查问卷收集了食堂满意度情况数据,保存在“data.csv”文件,如图a所示。
图a
图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()
思维点拨
明考向 本题考查利用Pandas进行数据统计
精点拨 (1)①一共有饭菜质量、饭菜价格等6个项目,每个项目都有满意、一般和不满意三个选项,因此需进行6次对不同项目进行分组统计,cols为项目名称的集合,colname是每个项目的名称,因此需按colname进行分组并统计各个选项的个数。以饭菜质量为例,得到的dfc对象如表所示。 饭菜质量序号0满意4
21一般5122不满意65
②dfc对象是每个项目colname的满意、一般和不满意3个项目的投票数,遍历该对象,name是每个选项的名称,因此需将每个选项的值添加到字典中去。 (2)根据字典data创建了一个df2对象,①将在df2对象中新增"不满意率(%)"列,其值计算方法为不满意选项数除以总得票数,在图表中可知,其值大于1,因此需乘以100。②创建图表的x轴为各个调查项目
答案 (1)①colname ②dfc.at[j,″序号″]或dfc[″序号″][j]或dfc.序号[j] (2)①df2[″不满意″]/df2[″总票数″]*100或df2[″不满意″]/po1l*100或df2.不满意/df2.总票数*100或df2.不满意/pol1*100或其他等价答案 ②df2[″调查项目″]或df2.调查项目
变式 某学校开设选修课并在期末让学生对其进行满意度调查,选修课分艺术、体育、语言、计算机、职业技能等领域。现要进行报名数据处理和满意度分析, 请回答下列问题:
图a
图b
(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对象中取出选修课名称列的内容。
重难点1 利用Pandas批量处理文件
1.高一年级(9个班级)进行“七选三”预选科。每个班一个Excel文件(如图a所示)存储预选科数据。数据表中“1”代表学生选择该科目,空白代表学生未选择该科目(某班部分选科数据如图b所示)。请回答下列问题。
图a
图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]}
①在程序划线处应填入的正确代码段为________(多选,填字母)。(注:全部选对的得 2 分,选对但不全的得1分,不选或有选错的得 0 分)
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,只有一列,列的标题是人数。
2.学校暑期开展“青春迎亚运”活动,邀请高二学生每日参加运动锻炼并进行线上打卡。每周收集一次相关数据,分别保存在相应的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)略。
3.为统计分析不同年级学生名字中的常用字,小王同学收集了本校所有学生的名字,并以入学年份为文件名分别保存在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个字,纵轴为每个字对应出现的次数。
4.小明利用“在线社团报名系统”收集了全校学生的社团报名信息,并将报名数据导出到“社团报名.xlsx”中,如图a所示。然后编写Python程序对报名数据进行处理,生成分别以班级名和社团名为文件名的Excel文件,以便分发给相应的社团指导老师和班主任。
图a
图b
(1)在对表格进行数据整理时发现,关于“Jacky.Y”同学的记录可能存在的数据问题是________(选填:A.数据缺失 B.数据异常 C.逻辑错误 D.数据格式不一致)。
(2)其中生成每个社团名单文件的过程是:先对报名数据按社团名称进行分类,并对选报同一社团的学生按班级进行升序排序,然后生成各个社团名单文件,如图b所示。对应的程序代码如下,请在划线处填写合适的代码。
import pandas as pd
def read_file(filename):
  #读入报名数据的原始文件,并将表中的数据转换成列表,代码略
def save_file(a): #保存名单到相应社团的Excel电子表格文件
  df = pd.(共171张PPT)
第二部分 算法与程序设计
专题9 pandas数据统计
1.对DataFrame对象按列进行公式计算,描述DataFrame对象数据以字典中键为列的存储形式;
2.对每个键对应一列数据多个值进行切片,掌握取出不同数据区域内容的方法;
3.运用函数统计对象的平均值等操作,运用排序函数对数据进行有序排列;
4.运用groupby函数对数据进行分组的方法,并在分组的基础上进行数据统计.
目 录
CONTENTS
体系构建
01
真题再现
02
考点精练
03
当堂检测
04
课后练习
05
体系构建
1
Pandas有Series和DataFrame两种对象,这两种对象均有index和values属性,Series对象的values是一维的,DataFrame的values是二维的,因此DataFrame对象比Series对象多一个columns属性,可以理解为index表示行号,columns表示列名。pandas处理的对象主要是DataFrame,取出DataFrame中的一列,降维为Series对象,可以用list函数转换为列表,对某列的值进行切片,可以转换为一个数值。可以对记录选取、筛选和分组操作,灵活地区分不同类型的数据,可以对记录进行排序操作,实现数据的有序显示。可以对各条记录的字段进行遍历,统计符合要求字段值的数量、总和、平均值以及最值。
真题再现
2
(2024年1月浙江省选考)某学院举行运动会,比赛设跳高、100米等项目,每个项目分男子组和女子组。现要进行报名数据处理和比赛成绩分析。请回答下列问题:
(1)运动会报名规则为:对于每个项目的男子组和女子组,每个专业最多各报5人(如“软件工程”专业在男子跳高项目中最多报5人)。软件工程专业的报名数据保存在DataFrame对象df中,如图a所示。若要编写Python程序检查该专业男子跳高项目报名是否符合规则,下列方法中,正确的是________(单选,填字母)。
A.从df中筛选出性别为“男”的数据dfs,再从dfs中筛选出项目为“跳高”的数据,判断筛选出的数据行是否超过5行
B.对df中数据按性别排序并保存到dfs中,再从dfs中筛选出项目为“跳高”的数据,判断筛选出的数据行是否超过5行
C.从df中筛选出项目为“跳高”的数据dfs,判断dfs中是否有连续5行以上的男生数据
(2)运动员比赛成绩的部分数据如图b所示。根据已有名次计算得,第1名至8名分别计9,7,6,5,4,3,2,1分,第8名之后计0分。实现上述功能的部分Python程序如下,请在程序中划线处填入合适的代码。
import pandas as 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)①从图表中可以看出是按″专业″进行分组;②图表横轴为专业名称,纵轴为各专业的得分情况。
(1)运动会报名规则为:对于每个项目的男子组和女子组,每个专业最多各报5人(如“软件工程”专业在男子跳高项目中最多报5人)。软件工程专业的报名数据保存在DataFrame对象df中,如图a所示。若要编写Python程序检查该专业男子跳高项目报名是否符合规则,下列方法中,正确的是________(单选,填字母)。
A.从df中筛选出性别为“男”的数据dfs,再从dfs中筛选出项目为“跳高”的数据,判断筛选出的数据行是否超过5行
B.对df中数据按性别排序并保存到dfs中,再从dfs中筛选出项目为“跳高”的数据,判断筛选出的数据行是否超过5行
C.从df中筛选出项目为“跳高”的数据dfs,判断dfs中是否有连续5行以上的男生数据
考点精练
3
重难点1 利用Pandas批量处理文件
Pandas主要功能是计算一个集合对象中某个字段的记录数量、总和、平均值和最值(最大值或最小值)。这个集合可以是通过筛选找到符合处理条件的数据(子集),也可以是通过分组,将某列相同字段值的记录组合在一起,形成一个个的分组,再分别统计各个分组的数量、和、平均值和最值。这些功能Excel软件也可以实现,但若是数据分布在多个数据文件时,Excel软件就要手工不断地打开数据,重复进行统计,而Pandas可以通过算法,利用循环结构,将这些操作让计算机自动完成。
例题 小红收集了部分城市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)城市A 2021年PM2.5年平均浓度为34.6微克/立方米。由图c可知,城市A 2021年PM2.5月平均浓度超过年平均浓度的月份共________个。
思维点拨
明考向 本题考查利用Pandas进行数据统计
精点拨 (1)可以通过布尔型数据选取满足条件的行。(2)计算各月份PM2.5浓度的平均值,可以累加各月的每天PM2.5浓度的平均值。变量dayfile表示每天的数据文件名,题干已经提示“每天的数据分别保存在以8位日期字符串命名的CSV文件”,调用函数pmday(dayfile) ,可以得到当天PM2.5的日平均浓度,并保存于变量sd。当月的各天PM2.5的日平均浓度需要累加起来,最后求均值。③空横坐标为月份,纵坐标为PM2.5月平均浓度,即列表pm的数据。
(3)超过年平均浓度的月份为1、2、3、4、11月
答案 (1)D (2)①mdays[m] ②sm += sd ③pm (3)5
变式 学校食堂以服务质量进行了调查问卷,调查项目共 5 项(具体内容略)。12个班级的调查结果分别存储在“dy01.csv”“dy02.csv”等文件中(如图a所示),每个文件部分界面如图b所示。
现需要分析每个问题选“A”的情况,采用Python编制程序代码,请回答下列问题。
(3)根据上述统计的得分数据,统计每个问题选“A”的数量,绘制如图 c 所示的柱形图,请在划线处填入合适代码。
图c
import matplotlib.pyplot as plt
plt.title(″每个问题选A的总人数″)
plt.bar(①__________,
②__________,label='A 选项')
plt.legend()
plt.show()
解析 本题考查利用Pandas进行数据统计。(1)df.columns[1:]依次对应5个问题的名称,对每个问题进行筛选,找出选A的记录并统计数据,赋值给c,再将c添加到列表A_list中。(2) ①12个班级的班名存储在字符串s中,每个班名占两个数字,变量i表示每个班名的起始索引。②ans_list是一个二维数组,共12个元素,分别存储每个班5个问题的选A的人数,现要统计每个问题选A的总和,因此变量i是ans_list数组的列索引,变量j是ans_list数组的行索引。(3)图表的横轴为问题的名称x,纵轴为各个问题选A的总人数y。
答案 (1)c=len(df[df[col]==″A″])
(2)①s[i:i+2] ②s+=ans_list[j][i] (3)x,y
重难点2 利用函数按列进行数据统计
DataFrame是Pandas处理的主要对象,index属性记录了每行记录所在的行索引,columns属性记录每列的名称。df.列名就可以表示该列所有的数据的集合,可以运用函数计算一个集合对象的记录数量、总和、平均值和最值(最大值或最小值)。通过筛选找到符合处理条件的数据(子集)集合,再对集合进行求和等计算。通过分组,将某列相同字段值的记录组合在一起,形成一个个的分组,再分别统计各个分组的数量、和、平均值和最值。
例题 小明通过调查问卷收集了食堂满意度情况数据,保存在“data.csv”文件,如图a所示。
图a
图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()
思维点拨
明考向 本题考查利用Pandas进行数据统计
精点拨 (1)①一共有饭菜质量、饭菜价格等6个项目,每个项目都有满意、一般和不满意三个选项,因此需进行6次对不同项目进行分组统计,cols为项目名称的集合,colname是每个项目的名称,因此需按colname进行分组并统计各个选项的个数。以饭菜质量为例,得到的dfc对象如表所示。
精点拨 ②dfc对象是每个项目colname的满意、一般和不满意3个项目的投票数,遍历该对象,name是每个选项的名称,因此需将每个选项的值添加到字典中去。
(2)根据字典data创建了一个df2对象,①将在df2对象中新增"不满意率(%)"列,其值计算方法为不满意选项数除以总得票数,在图表中可知,其值大于1,因此需乘以100。②创建图表的x轴为各个调查项目
答案 (1)①colname ②dfc.at[j,″序号″]或dfc[″序号″][j]或dfc.序号[j] (2)①df2[″不满意″]/df2[″总票数″]*100或df2[″不满意″]/po1l*100或df2.不满意/df2.总票数*100或df2.不满意/pol1*100或其他等价答案 ②df2[″调查项目″]或df2.调查项目
变式 某学校开设选修课并在期末让学生对其进行满意度调查,选修课分艺术、体育、语言、计算机、职业技能等领域。现要进行报名数据处理和满意度分析, 请回答下列问题:
图a
图b
(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对象中取出选修课名称列的内容。
当堂检测
4
重难点1 利用Pandas批量处理文件
重难点2 利用函数按列进行数据统计
1.高一年级(9个班级)进行“七选三”预选科。每个班一个Excel文件(如图a所示)存储预选科数据。数据表中“1”代表学生选择该科目,空白代表学生未选择该科目(某班部分选科数据如图b所示)。请回答下列问题。
图a
图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.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,只有一列,列的标题是人数。
2.学校暑期开展“青春迎亚运”活动,邀请高二学生每日参加运动锻炼并进行线上打卡。每周收集一次相关数据,分别保存在相应的xlsx文件中,部分文件如图a所示;每个文件记录了一周7天的打卡数据,示例如图b所示,其中运动时长单位:分钟。
图b
图a
(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(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)略。
3.为统计分析不同年级学生名字中的常用字,小王同学收集了本校所有学生的名字,并以入学年份为文件名分别保存在Excel文件中,文件如图a所示,每个文件包含了学生的年级、姓名和性别信息,如图b所示。
编写Python程序。请回答下列问题:
(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个字,纵轴为每个字对应出现的次数。
4.小明利用“在线社团报名系统”收集了全校学生的社团报名信息,并将报名数据导出到“社团报名.xlsx”中,如图a所示。然后编写Python程序对报名数据进行处理,生成分别以班级名和社团名为文件名的Excel文件,以便分发给相应的社团指导老师和班主任。
图a
图b
(1)在对表格进行数据整理时发现,关于“Jacky.Y”同学的记录可能存在的数据问题是________(选填:A.数据缺失 B.数据异常 C.逻辑错误 D.数据格式不一致)。
(2)其中生成每个社团名单文件的过程是:先对报名数据按社团名称进行分类,并对选报同一社团的学生按班级进行升序排序,然后生成各个社团名单文件,如图b所示。对应的程序代码如下,请在划线处填写合适的代码。
import pandas as pd
def read_file(filename):
  #读入报名数据的原始文件,并将表中的数据转换成列表,代码略
def save_file(a): #保存名单到相应社团的Excel电子表格文件
答案 (1)B (2)①a[0][2] 或 df.at[0,“选报社团”] 或 df[“选报社团”][0] ②num=rs[i][1] ③imax = imin  ④save_file(a[s:s+num])
解析 本题主要考查Pandas数据处理。(1)逻辑错误一般指违背事物的业务逻辑,不符合预期的值,显然不适用于本题中的数据情况。(2)①空根据形参a生成当前的文件名,文件名根据图2可知是a所属的社团名称。②空实现分组双向选择排序,是对num的初始化。变量num用于表示当前组的总人数。③空imax=imin是在特殊情况下的imax重定向。由于imin与前端left元素交换时并未考虑imax的取值,当恰好imax==left时,最大值提前交换到了imin处,因此需要重定向。④空则是对排序好的当前组内数据提交保存为excel文件,调用save_file函数,当前组有效数据为a[s: s + num]。
4.小明利用“在线社团报名系统”收集了全校学生的社团报名信息,并将报名数据导出到“社团报名.xlsx”中,如图a所示。然后编写Python程序对报名数据进行处理,生成分别以班级名和社团名为文件名的Excel文件,以便分发给相应的社团指导老师和班主任。
1.某单位根据全省各县市区的公共设施与服务运行情况,编制了“公共服务惠民指数”与“公共设施匹配指数”,现要对该两项指数进行分析。请回答下列问题:
图a
图b
(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)
②程序中的方框中应填入的正确代码为________(单选,填字母)。
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的数据按公共服务惠民指数进行降序排序。
2.某校高一学生的社团报名数据存储在“stbm.xlsx”文件中,如图a 所示。
{'书画社':52,'动漫社':97,'摄影社':35,'汉学社':38,'法学社':51,
'诗词社':37,'辩论社':43,'音乐社':63,'飞羽社':56,'魔方社':29}
图c
(1)统计各社团报名人数,找出报名人数最多的三个社团(不存在并列名次情况)并创建如图b所示的图表。实现上述功能的 Python 程序如下,请在划线处填入合适代码。
import pandas as pd
import matplotlib.pyplot as plt
#设置中文字体,代码略
df=pd.read_excel(″stbm.xlsx″)
df1=df.groupby(″①__________″,as_index=False).count()
#删除df1的“班级”列,并将列标题“姓名”重命名为“人数”,保存修改结果,代码略
df2=df1.sort_values(″人数″,ascending=False)
df3=df2.②________
plt.bar(df3.社团,③________)
plt.title(″报名人数最多的前三个社团″)
plt.show()
#将各社团报名人数存入字典stdic并输出,结果如图c所示,代码略
(2)受场地限制,每个社团开展活动人数上限为45人。解决方案:超过45人的社团分成若干班级,每班人数按一定规则分配。编程解决社团分班问题,并输出如图d所示分班方案,请在划线处填入合适代码。
{'书画社':[26,26],'动漫社':[32,32,33],
'摄影社':35,'汉学社':38,'法学社':[25,26],
'诗词社':37,'辩论社':43,'音乐社':[31,32],
'飞羽社':[28,28],'魔方社':29}
图d
(3)若“动漫社”实际报名人数为98人,则利用上述程序段进行分班后得到的结果为_______________________________________________________________
(单选,填字母:A.'动漫社':[32,33,33]/B.'动漫社':[32,32,34])。
答案 (1)①社团 ②head(3) ③df3.人数或 df3[″人数″] (2)x+stdic[i]%n或stdic[i]-(n-1)*x或stdic[i]-j*x或stdic[i]-sum(num) stdic[i]-len(num)*x或stdic[i]-(n-1)*num[0] (3)B
解析 (1)统计各社团报名人数,需按社团进行分组统计。②找出报名人数最多的三个社团,用head函数获取前三条记录。③纵轴为排序后的社团人数。(2)当前社团人数stdic[i]大于45时,先确定班级数量n,再确定平均每班人数x,若是最后一个班级,则num中添加剩余人数stdic[i]-(n-1)*x。(3)报名人数为98人将分成3个班,根据x=stdic[i]∥n算计得到x的值为32,将剩余人数34添加到最后。
3.小温对 5 个景区进行网络问卷调查,问卷中“环境”“硬件”“服务”和“交通”设置的选项及分值均一致,部分界面如图a所示。导出数据的部分界面如图b所示,其中数字对应问卷中每题的选项,如数字 i 代表该题的第 i个选项。请回答下列问题。
(2)找出18~39 岁年龄段游客评分均值最高的景区,请在划线处填入合适的代码。
jq=[″雁荡山″,″楠溪江″,″渔寮″,″南麂列岛″,″氡泉″]
df1 = df[①________]
df2 = df1.groupby(″景区″, as_ index=False)[″评分″].mean()
df2 = df2.sort_values(″②________″, ascending=False)
print(jq[df2[″景区″][0]-1])
(3)根据上述 df2 中的评分数据, 绘制如图 c 所示的垂直柱形图, 代码如下:
A.x=jq
y=df2[″评分″]
B.x=df2[″景区″]
y=df2[″均差″]
C.x=jq1
y=df2[″均差″]
答案 (1)C (2)①df[″年龄″]==2或者df.年龄==2; ②评分 (3)C
解析 (1)统计每份问卷对应景区的评分,数字i代表该题的第i个选项,即数字1代表第1个选项,计2.5分,数字2代表第2个选项,计2分,以此类推。(2)①找出18~39岁年龄段游客评分均值最高的景区,18~39岁是第2个选项。②找出18~39岁年龄段游客评分均值最高的景区,需对df2中的评分进行降序排序。(3)A选项垂直柱形图横坐标景区的顺序和jq变量中景区的顺序不同。B选项柱形图横坐标为各景区的名字,而df2中景区一列为数字。
4.张三同学收集了一个地区 8 月各类共享单车的骑行数据记录,每天的用户数据存储于“shared_bikes.xlsx”文件中,不考虑跨天数据。数据格式如图a所示,请回答下列问题:
(2)统计本月各类型单车的每天平均骑行时长,并绘制柱形图,代码如下,绘制的图表如图b所示,请在划线处填入合适的代码。
图b
答案 (1)int(s[p+1:q]) * 60 (2)①df.index或range(len(df)) ②sm[j] += t 
③avg (3)D
解析 本题考查Pandas数据统计。(1)p记录空格位置,q记录冒号位置,而小时介于这两者之间。取出小时后转换为数字再乘以60。(2)①按行遍历整个df对象,行的数量为0至len(df)-1,也可以在index属性中取出。②变量j遍历bike列表索引位置,找到相同类型就保存对应的sm列表元素中。③最后统计各种类型的平均值avg,因此y轴保存avg值。(3)骑行次数应对分组后数据进行计数。
课后练习
5
重难点1 利用Pandas批量处理文件
重难点2 利用函数按列进行数据统计
1.管理员从该停车系统中导出了 3 月份每天的停车记录,如图a 所示,每天的停车记录内容格式如图b 所示(进出标记为 0 表示驶入,1 表示驶出,停车记录已按进出时间升序排列)。
图a
车牌 进出时间 进出标记
川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 为该车牌当天的进出时间记录。函数代码如下,请回答下列问题:
①程序段中加框处应填入的代码为________(单选,填字母)。
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代码如下,请在划线处填入合适的代码。
(3)已知每月分为3个时间段,1-10日称为上旬,11-20日称为中旬,21-30(31)日称为下旬。则由图c可知,该停车场3月份________(选填:上旬/中旬/下旬)收入总和最高。
答案 (1)①D ②p+=1或p=p+1
(2)①dic[i]=0 ②df_g[k]>1 (3)下旬
解析 (1)①遍历数据data,进出标记为 0 表示驶入,1 表示驶出,先有驶入,再有驶出。②处理下一条记录。(2)①语句dic[i]+=readdata(data)将计算每天的费用,因此需对dic[i]赋值为0。②df_g是按车牌进行分组记录数量,只有一条驶入或驶出记录的车辆不参与计费,即df_g[k]的值大于1。(3)略。
2.小明为了研究某地近十年每月的温差变化,编写Python程序。以2023年4月为例,该月每天的温度数据分别保存在以8位日期字符串命名的excel文件中,部分文件如图a所示,每个文件记录了一天24小时的温度数据,如图b记录了4月28日的数据。
图a
图b
(2)定义find函数,功能为:用字典创建DataFrame对象,并筛选出4月份温差大于13的日期,输出结果如图c所示,请在划线处填入代码。
日期 温差
3 0404 13.1
9 0410 13.1
15 0416 13.3
17 0418 13.8
27 0428 15.5
图c
def find(r,t):
  dic={″日期″:r,″温差″:t}
  df1=pd.DataFrame(dic)
  df2=______________
  return df2
(3)绘制4月份每天的温差柱形图,部分Python程序如下,请在划线处填写合适的代码。
答案 (1)C (2)df1[df1.温差>13]或df1[df1[″温差″]>13] (3)①i+1 ②dv(dayfile) ③td
解析 (1)df[″温度″].max()表示当天最高温度,df[″温度″].min()为最低温度。
(2)对温差进行筛选。(3)①变量i的值为0至29,而日期为1号至30号。②调用dv函数求每天的温差。③y轴为温差td。
3.小美收集了某电商平台某年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 = [],[]
plt.show() #生成线形图如图c所示
图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)略。
4. 一球迷收集了近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):
答案 (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]中。
5.李老师收集了 2022 级学生“七选三” 选课意愿数据,每个班的数据分别保存以'xk'+班级为命名的 xlsx 文件中,如图a所示,每个文件记录了该班每位学生的选考科目选课情况,如图b所示。
(2)统计“技术”选课人数占总人数的比例,并作出各个科目选课人数的柱形图。程序代码如下,请在划线处填入合适的代码。
图c
答案 (1)① i<10或者i<=9 ② data (i)
(2)①km[j]+=1 ②km['技术']/len(df)
③df_km['科目'] (3)物理、化学、地理(不分顺序)
解析 本题考查Pandas与Matplotlab模块相关知识。(1)①空在班号前补0,当i值介于1-9之间时需要补0。②函数data功能代入班号,生成班级文件名,用pd_read将对应文件转换为dataframe对象返回。(2)①遍历学生所选学科,统计各科选课人数,以科目为键将结果存入字典km。②空统计技术选考人数占总人数的比例,而总人数可以通过len(df)得到。③观察图表x轴数据为科目。(3)略。
6.某同学收集了部分城市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):
答案 (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是城市名称列表。
1.某竞赛获奖名单已公布,现要对获奖情况进行数据处理和分析。请回答下列问题:
图a 
图b 
(1)将获奖名单读取到DataFrame对象df中,如图a所示,若要编写Pandas程序分析出浙江省内获得满分400分的总人数。下列方法正确的是________(单选,填字母)。
A.从df中筛选出省份为“浙江”的数据df1,再从df1中筛选出总分为“400”的数据df2,最后对df2中的“姓名”数据列使用count()函数统计出总人数
B.对df中数据按“总分”降序排列并保存到df1中,再从df1中筛选出省份为“浙江”的数据df2,最后对df2中的“姓名”数据列使用sum()函数统计出总人数
C.对df中数据按“总分”为关键字进行分组,并使用count()函数统计出总人数,得到数据df1,再从df1中筛选出省份为“浙江”的总人数
(3)获奖名单新增“获奖等级”数据列,存储在文件“data.xlsx”,如图c所示,小陆想分析出一等奖获奖人数最多的前5个省份(没有并列情况),并绘制如图d所示的柱形图,实现该功能的部分Python程序如下。
图c
图d
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams[″font.sans-serif″] =
[″SimHei″] #设置图表显示中文字体
df = pd.read_excel(″data.xlsx″)
df1 =①________ #选取相应的一等奖数据
df2 = df1.groupby(″省份″).count() #分组统计
总人数
df2.rename(columns = {″姓名″:″获奖人数″}, inplace = True) #更改列标题名称
g = df2.sort_values(″获奖人数″, ascending = False).head(5)
plt.title(″一等奖获奖人数最多的前 5 个省份″)
plt.bar( ②________ ) #绘制柱形图
plt.ylabel(″获奖人数″)
plt.show()
①请在程序中划线处填入合适的代码。
②程序的划线处中应填入的正确代码为________(单选,填字母)。
A.g.省份,g.获奖人数 B.df2[″省份″],df2[″获奖人数″]
C.g.index,g.获奖人数 D.df2.index,df2.获奖人数
答案 (1)A (2)①lst[i][2]>=h ②dic[city]=lst[i][1] (3)①df[df.获奖等级==″一等奖″] 或 df[df[″获奖等级″]==″一等奖″] ②C
解析 (1)B选项姓名列是字符串类型,不能进行sum求和。C选项不能按总分进行分组。(2)①找出一等奖的条件是lst[i][2] >= h。②不在字典中,新建一个以city为名的新键值对。(3)略。
2.为了督促学生寒假坚持体育锻炼,老师采用线上打卡的方式收集学生锻炼情况,数据如图a所示。
图a
图b
为统计冬锻完成情况,编写 Python 程序。请回答下列问题:
(1)定义outdata函数,其中参数dftmp是DataFrame数据类型,数据由图a所示的Excel表导入。函数功能是:统计每天每个学生的锻炼项目个数,返回含有“学籍号”、“姓名”和“项目个数”信息的二维列表。
函数代码如下,划线处应填入的代码为________(多选,填字母)。
A.dftmp.at[i,j]==″√″ B.dftmp[i][j]==″√″
C.dftmp.at[j,i]==″√″ D.dftmp[j][i]==″√″
def outdata(dftmp):
  a=[]
  for i in dftmp.index: #dftmp 的行索引
(2)冬锻打卡成功的标准为累计运动 15 天,每天锻炼项目达到 3 项及以上。统计输出寒假体育锻炼达标的学生名单,并制作四个项目的运动次数对比图,部分界面如图b和图c所示。部分Python程序如下,请在划线处填写合适的代码。
图c
答案 (1)AD (2)①days=1 ②i+=1
③yd1[4:]或yd1.values[4:]
(3)not flag[i] and lst[i][2]>=3
解析 (1)变量i为行索引,变量j为列标题,可以用字典法,也可以用at函数来表示某个单元格名单。(2)①对days初始化为1。②遍历下一条记录。③前4列依次为日期、学籍号、姓名和性别,从第列开始统计的是项目的次数。(3)每天锻炼项目达到 3 项及以上,即第1次达到后就是达标,以后的表示已经达标,因此和flag[i]的状态有关。
3.小帅收集了2023年的销售数据并存储在″超市销售数据.csv″文件中,部分数据如图a所示。分析某月的销售情况,柱形图如图b所示。部分Python程序如下:
顾客编号,大类名称,销售日期,小类名称,商品类型,单位,销售数量,商品单位,销售金额
5,粮油,20230101,番茄酱,一般商品,瓶,1,6.7,6.7
10,日配,20230101,冷藏果粒酸乳,一般商品,盒,1,8.9,5.9
26,冲调,20230101,麦片/粉,一般商品,袋,1,27.7,27.7
31,洗化,20230101,洗衣皂,一般商品,块,1,4.9,4.9
31,洗化,20230101,软抽纸巾,一般商品,提,1,9.7,6.9
49,蔬果,20230101,花果,生鲜,千克,0.902,9.96,8.98
8,日配,20230101,利乐砖纯奶,一般商品,提,1,65,49
15,家居,胶棉拖把,一般商品,把,1,70,70
50,休闲,20230101,软糖,一般商品,袋,1,10.9,10.9
1,蔬果,20230101,芽菜,生鲜,千克,0.456,2.78,1.27
5,蔬果,20230101,鲜调味,生鲜,千克,0.24,9.6,2.3
2,洗化,20230101,无芯纸,一般商品,提,1,24.9,18.9
9,休闲,20230101,趣味/休闲,一般商品,盒,1,6.9,6.9
46,蔬果,20230101,苹果类,生鲜,千克,1.776,4.98,8.84
图a
图b
请回答下列问题:
(1)为提取“销售日期”中月份数据,划线处应填入的代码是________(单选,填字母)。
A.df.index B.df.values C.df.columns
(2)请在程序中划线①②处填入合适的代码。
(3) 加框处实现按“销售金额”降序排列后取前10项,下列代码中能正确实现的有________(多选,填字母)。(注:全部选对的得2分,选对但不全的得1分,不选或有选错的得0分)
A.g.sort_values(″销售金额″,ascending=False).tail(10)
B.g.sort_values(″销售金额″,ascending=False).head(10)
C.g.sort_values(″销售金额″,ascending=True)[:11]
D.g.sort_values(″销售金额″,ascending=False)[:10]
答案 (1)A (2)①df.月份==month或df[″月份″]==month ②g.销售金额或g[″销售金额″] (3)BD
解析 (1)表达式df.at[i,″销售日期″]中,变量i表示记录的行索引,因此需遍历df的行索引集合。(2)①输入需查询的月份month,筛选月份数据的条件是月份列中值为month。②图表的纵坐标为销售金额。(3)按“销售金额”降序排列后取前10项,可以采用head函数,也可以采用切片,但切片时得到的是前闭后开的区间。
4.小陈在气象部门得到了一份2022年不同城市的月平均日照时数(单位:kW·h/m2/day)数据,存放在Excel文件“日照.xlsx”中。部分界面如图所示。
图a
(2)第2步,仅考虑平均日照时数因素,选出最适合用光伏发电给智能农业大棚提供能源的十个城市。划线处应填入的代码为________(单选,填字母)。
df=________
A.df.sort_values(″城市名″,ascending=False).head(10)
B.df.sort_values(″城市名″).tail(10)
C.df.sort_values(″年度平均″,ascending=False)[:10]
D.df.sort_values(″年度平均″,ascending=False).tail(10)
#输出结果如图b所示,代码略
年度平均最高的10个城市为:
日喀则地区 5.83
阿里地区 5.66
三沙市 5.57
山南地区 5.53
拉萨市 5.53
那曲地区 5.11
昌都地区 4.91
海西蒙古族藏族自治州 4.88
和田地区 4.84
攀枝花市 4.83
图b
(3)小陈想在家乡温州建一个智能大棚,采用光伏发电加蓄电设备供电,面积为1平方米的光伏板容量约为0.3 kW/块,光伏的充放电效率为80%,大棚每天消耗的最低电能约为30 kW·h,为确保每月能正常供电,需要1平方米的光伏发电板共①________块。(日均发电量=电池板的容量/块×块数×平均日照时数×充放电效率)
建设光伏发电设备前要先获得当地的平均日照时数情况,小陈通过如下代码获取相关数据。程序运行界面如图c所示:
图c
res=df[df[″城市名″]==″温州市″]
res=res.values[0][1:13].②________
print(″温州市月平均日照最小值为”,res)
答案 (1)计算每个城市的年度平均日照时数 (2)C (3)①52 ②min()
解析 本题考查Pandas相关操作及其应用。(1)mdays列表中存放每个月的天数,Excel表格中存放的是每个月的月平均日照时数,通过for循环将月平均日照时数*每个月的天数并进行累加,得到全年的日照时数,再计算出当前城市的日平均日照时数,并通过round函数保留2位小数。故该程序功能为计算每个城市的年度平均日照时数。(2)最适合用光伏发电的十个城市即日照时数最长的十个城市,通过sort_vlaues进行降序排序,取前十个。(3)根据图c可知温州市月平均日照最小值为2.42,再根据公式:日均发电量=电池板的容量/块×块数×平均日照时数×充放电效率。0.3 kW/块*块数*2.42*0.8=30 kW,得到需要的光伏发电板共52块。②处使用min()函数求最小值。
5.小周要统计高二年级各班的行为规范得分情况,部分扣分数据如图a所示。
图a
(1)观察数据,发现存在重复扣分的记录,如图a第2、3行所示。现需对数据进行整理,以下操作合理的是____(单选,填字母)。
A.对班级、记录员均相同的记录去重
B.对日期、关联学生、项目名称均相同的记录去重
C.对关联学生、项目名称、项目扣分均相同的记录去重
(3)该校高二年级共有16个班级,统计各班的行为规范得分(班级行为规范得分=100分-本班所有学生扣分),并绘制如图b所示的柱形图,实现该功能的部分Python程序如下,请在划线处填入合适的代码。
图b
答案 (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中存储每个班级的得分。
6.某中学“7选3”选考科目的选科数据存储在Excel文件“选科数据.xlsx”中,部分数据及格式如图a所示。图中“1”表示选择该科目为选考科目。现对数据进行统计分析,编写Python程序,请回答下列问题。
图a
(2)统计7选3各科的选报人数,输出各科的选报情况及开班情况,如图b所示。部分程序代码如下,请在划线处填入合适的代码。
物理 人数:398 班级数:10
化学 人数:408 班级数:11
生物 人数:133 班级数:4
政治 人数:261 班级数:7
历史 人数:244 班级数:7
地理 人数:361 班级数:10
技术 人数:136 班级数:4
图b
import pandas as pd
df=pd.read_excel(″选科数据.xlsx″)
km=[″物理″,″化学″,″生物″,″政治″,″历史″,″地理″,″技术″]
m=40 #每个班的最多人数,班额
bj=[0]*7
xkrs=[0]*7 #存储选考科目的选报人数
p=0
for j in km:
  ①________
  for i in range(len(df)):
  if df.at[i,j]==1:
    cnt+=1
  ②________
  bj[p]=fenban(cnt,m)
p=p+1
for i in range(7):
  print(km[i],″人数:″,xkrs[i],″班级数:″,bj[i])
(3)绘制选考科目选科人数情况的柱形图,部分Python程序如下,请在划线处填写合适的代码。
import matplotlib.pyplot as plt
x=km
y=__________________
plt.bar(x,y)#绘制柱形图
#设置绘图参数,显示如图c所示柱形图,代码略
图c
(4)下列程序能实现按班级统计各班选报技术学科人数的是________(单选,填字母)。
A.jsrs_bj=df.groupby(″班级″).″技术″.count()
B.jsrs_bj=df.sort_values(″班级″).count()
C.jsrs_bj=df.groupby(″班级″)[″技术″].count()
D.jsrs_bj=df.groupby(″班级″).技术.mean()
答案 (1)allrs%maxbrs!=0或allrs%maxbrs>0或bjnum*maxbrs解析 (1)当选报总人数allrs是每班最多人数maxbrs的倍数时,开设的班级数为bjnum,否则需要再增加一个班级 。(2)对变量cnt赋初值0。②统计当前学科的选报人数,因此代码为 xkrs[p],也可以写为xkrs[km.index(j)]。(3)图表的纵坐标数据为各科的选科人数xkrs。(4)略。
7.第19届杭州亚运会已完美落幕,亚运会赛事以“杭州为主,全省共享”的原则分布在杭州、宁波、温州、湖州、绍兴、金华各地。大会共有40个大项,61个分项,最终诞生了481块金牌。小李作为一名体育爱好者想重温大会赛程安排,他从杭州亚运会的官网上采集了相关数据,整理后存储在“杭州第19届亚运会总赛程.xlsx”文件中。如图a所示(0表示有赛事但不产生金牌,其他数字表示当天产生的金牌数)。
图a
为了更清楚地了解相关赛事信息,小李编写了Python程序,请回答以下问题。
(1)足球是小李最关注的大项,为了解足球的赛程安排,划线处应填入的代码为________(单选,填字母)
A.df.大项==″足球″ B.df[″大项″==″足球″]
C.df[df.大项==″足球″] D.df[df[″大项″]==足球]
import pandas as pd
df=pd.read_excel(″杭州第 19 届亚运会总赛程.xlsx″)
df2=________
print(df2)
(2)足球项目的比赛分布在杭州等城市的八个场馆,了解各个场馆举办足球赛事的具体场次,找到连续举办足球赛事最多的场馆,如图b所示。程序代码如下,请在划线处填入合适的代码。
黄龙体育中心体育场 [9/19, 9/21, 9/24, 9/27, 9/28, 10/1, 10/4, 10/6, 10/7]
临平体育中心体育场 [9/19, 9/21, 9/22, 9/24, 9/25, 9/28, 9/30, 10/3]
上城体育中心体育场 [9/20, 9/22, 9/24, 9/25, 9/27, 9/28, 10/1, 10/3, 10/7]
萧山体育中心体育场 [9/19, 9/20, 9/21, 9/22, 9/24, 9/25, 9/27, 9/28, 10/1, 10/4]
金华体育中心体育场 [9/19, 9/21, 9/24, 9/27]
浙江师范大学东体育场 [9/19, 9/21, 9/24, 9/27]
温州奥体中心体育场 [9/21, 9/22, 9/24, 9/25, 9/27, 9/28, 9/30]
温州体育中心体育场 [9/22, 9/24, 9/25, 9/27, 9/28, 9/30]
连续举办足球赛事最多的场馆:萧山体育中心体育场
图b
(3)足球在亚运会期间总共产生两枚金牌,统计分析其他大项产生的金牌总数,找出产生金牌总数最多的十个大项,并绘制图形如图c所示。程序代码如下,请在划线处填入合适的代码。
图c
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['simhei'] #图表中文标签显示为黑体
grp=df.groupby(①________ , as_index=False).金牌总数.sum()
grp=grp.sort_values(″金牌总数″,ascending=False).②________
x=grp.大项
y=grp.金牌总数
#设置图表参数,代码略。
答案 (1)C (2)①dic[sta].append(j)或 dic[sta]+=[j] ②c=0 ③maxsta
(3)①″大项″ ②head(10)
解析 (1)了解足球的赛程安排需符合″大项″列中值为″足球″的记录。(2)①遍历每行的第3列到倒数第4列,若这些单元格中值为0或1,表示该天举办足球赛事,将当天日期j添加到字典dic以场馆名称sta为键的值中。②统计连续举办足球赛事最多的场馆,若当天没有赛事,则将连续天数s的值置为0。③连续举办足球赛事最多的场馆名称保存在变量maxstak。(3)①统计分析其他大项产生的金牌总数,需按大项进行分类统计。②grp对象的sort_values方法是按金牌进行降序排列,找出产生金牌总数最多的十个大项,因此需用head函数。

展开更多......

收起↑

资源列表