第 14 题
答案与解析
第(1)①小题
D
A
E
数据处理过程
df = pd.read_excel("销售清单数据.xlsx")读取销售明细得到 DataFrame。图 a 中同一订单号可以出现多行,每行对应一种商品的购买明细,因此直接统计原表行数并不等于订单数。
df1 = df[df['商品类别'] == '生鲜']保留商品类别为“生鲜”的明细,得到所有购买生鲜商品的记录。
# 同一订单保留一条,提取购买时间中的"小时"数据,另存为df2,结果如图b所示,代码略经过题目省略的去重和提取操作,df2 每行代表一个购买过生鲜商品的订单,只保留“订单号”和“小时”两列;此后按小时统计这些行,才能得到各时段的生鲜订单数量。
填空分析
①
要求统计订单数量,应按“小时”分组,对各组的订单号计数,而不是把订单号或购买数量求和。订单号已去重且非空,count() 得到的就是订单数。后续绘图还要访问“小时”列,故使用 as_index=False,让小时继续保存在普通列中,填写 D:
df2 = df2.groupby('小时', as_index=False).count()
聚合后的“订单号”列不再保存订单编号,而是保存该时段的订单数量。
按图 c 的时段范围,分组结果的结构如下,N08、N09 等表示对应时段的订单数,不是另造的统计结果:
| index | 小时 | 订单号 |
|---|---|---|
| 0 | 08 | N08 |
| 1 | 09 | N09 |
| … | … | … |
| 13 | 21 | N21 |
②
现在“订单号”列保存的是各时段的订单数。题目要求降序分布,应按该列从大到小排序,填写 A:
df2 = df2.sort_values('订单号', ascending=False)
按“小时”排序只能得到时间先后顺序,不能保证订单数降序。sort_values() 改变行的排列顺序,但不会自动重置行索引。
③
横轴应显示时段,纵轴应显示该时段的订单数,所以分别取“小时”列和“订单号”列,填写 E:
plt.bar(df2['小时'], df2['订单号'])
图 c 的横轴按订单数降序排列,绘图时“小时”应使用字符串类别标签,例如“09”“18”。若省略的提取代码得到的是整数小时,还需先转为字符串,否则 Matplotlib 会按数值坐标放置柱形,单靠行排序不能得到图 c 的横轴顺序。df2.index 只是排序后保留的行索引,也不能代替小时标签。
第(2)小题
t[j] == t[i]
res = t[i]
i = j
程序分析
res = "" # 存储出现频次最高的类别
max_c = 0 # 存储最高频次
i = 0
while i < len(t):
count = 1
j = i + 1
...题目已把 t 升序排序,相同类别会连续排列。res 和 max_c 分别保存当前选中的类别及最高频次。每轮从位置 i 开始,先计入 t[i],所以 count 初值为 1;j 从其后一位开始,准备继续向右检查。
while j < len(t) and ①:
count += 1
j += 1内层循环每继续一次,count 增加 1,j 向右移动一位;j < len(t) 防止访问越界。循环是否继续,还需由空①判断当前位置是否属于本轮统计的类别。
if count > max_c:
②
max_c = count
③只有本轮次数严格大于 max_c 时,程序才进入分支,并把最高频次更新为 count;相等时保留已有结果。之后还需更新外层位置,使程序能继续处理列表剩余部分。
填空分析
①
本轮统计的是从 i 开始连续出现的 t[i]。因此只有 t[j] 与 t[i] 相同,才能继续把它计入次数,应填 t[j] == t[i]。循环结束时,j 指向第一个不同类别的位置,或等于 len(t);区间 t[i:j] 正好是当前类别的一整组。
②
进入该分支说明当前类别的出现次数超过已有最高频次。更新 max_c 的同时,应把该类别记入 res,故填 res = t[i]。这里的“最早出现”按遍历已排序列表 t 的先后理解:条件使用 > 而非 >=,并列时不会用后遇到的类别覆盖先遇到的类别。若要求按原始销售记录的出现先后打破并列,仅凭已排序的 t 不能恢复这一顺序。
③
当前类别已统计完,j 正好是下一组的起点,故令 i = j,跳过刚处理过的一整组。最后一组处理完时 j == len(t),更新后外层循环自然结束。参考答案中的 i += 1 也能得到相同结果,但会重复统计同组的剩余部分;i = j 可以避免这些重复操作。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_03_G3_qiangjilianmeng_q014
