merge() 方法 B. concat() 方法 C. agg 方法 D. drop() 方法 答案:C 解析: 语料明确:聚合操作用 agg 方法实现。merge/concat 属于合并和连接,drop 用于删除行或列。agg 时,参数是一个字典,其中键和值分别是? A. 键是操作名,值是列标签 B. 键是列标签,值是操作名(或操作名列表) C. 键是行标签,值是分组名 D. 键是分组对象,值是数据框 答案:B 解析: 课程说明:参数是一个字典,列标签是键,操作名是值。多种聚合时,值写成操作名列表。agg 方法。['sum','max']。 答案:√ 解析: 语料示例:group.agg({'一季度':['sum','max']}),参数是操作名列表。一种聚合则写字符串,如 'sum'。concat 是数据框连接方法,不是分组聚合函数。from pandas import DataFrame
df = DataFrame({
'姓名': ['赵四', '钱多', '孙冰', '李萌', '周金', '吴达', '郑华', '王军'],
'分区': ['天河', '黄埔', '越秀', '黄埔', '天河', '天河', '黄埔', '越秀'],
'一季度': [2572, 2845, 2100, 4483, 4109, 2435, 4663, 4839],
'二季度': [3291, 3161, 3371, 3810, 2322, 4863, 1831, 1214],
'三季度': [4388, 3723, 3901, 1070, 3056, 1576, 1451, 3639],
'四季度': [2672, 3663, 3024, 2312, 4066, 1934, 3456, 2649]
})
group = df.groupby('分区')
print(group.agg({'一季度': 'sum'}))
A. 9116 B. 6939 C. 11991 D. 4109 答案:A 解析: 这是「对一个列标签执行一种聚合」。天河三人一季度为 2572、4109、2435,和为 9116。越秀 6939、黄埔 11991 是另外两个分区的总和;4109 是天河一季度最大值,不是求和。
group,执行 group.agg({'一季度':['sum','max']}) 后,越秀区一季度的 max 是? A. 2100 B. 4109 C. 4663 D. 4839 答案:D 解析: 这是「对一个列标签执行多种聚合」。越秀两人一季度为孙冰 2100、王军 4839,最大值为 4839。4109 是天河最大值,4663 是黄埔最大值。agg 的三种用法,下列说法正确的有: A. 对一个列执行一种聚合时,字典的值是字符串,如 {'一季度':'sum'} B. 对一个列执行多种聚合时,字典的值是操作名列表,如 {'一季度':['sum','max']} C. 对多个列执行多种聚合时,每个列标签和操作构成一个键值对 D. 多列聚合时必须让所有列使用完全相同的一组操作 答案:ABC 解析: 语料三种写法分别对应 A、B、C。第三种示例中一季度用 ['sum','max']、二季度用 ['mean','min'],不同列可以指定不同操作,故 D 错误。agg 会把聚合结果按原始数据框的每一行对齐回去,与 transform() 效果相同。 答案:× 解析: agg 把每个组压缩成一行汇总(结果以分区为行索引)。把操作应用到每一组并对齐回原始各行的是下一节的 transform(),二者不要混淆。from pandas import DataFrame
df = DataFrame({
'姓名': ['赵四', '钱多', '孙冰', '李萌', '周金', '吴达', '郑华', '王军'],
'分区': ['天河', '黄埔', '越秀', '黄埔', '天河', '天河', '黄埔', '越秀'],
'一季度': [2572, 2845, 2100, 4483, 4109, 2435, 4663, 4839],
'二季度': [3291, 3161, 3371, 3810, 2322, 4863, 1831, 1214],
'三季度': [4388, 3723, 3901, 1070, 3056, 1576, 1451, 3639],
'四季度': [2672, 3663, 3024, 2312, 4066, 1934, 3456, 2649]
})
group = df.groupby('分区')
print(group.agg({'一季度': ['sum', 'max'], '二季度': ['mean', 'min']}))
A. 3492.0 与 1831 B. 2292.5 与 1214 C. 2934.0 与 2322 D. 3492.0 与 1214 答案:A 解析: 多列多种聚合。天河二季度为 3291、2322、4863,均值 (3291+2322+4863)/3=3492.0;黄埔二季度为 3161、3810、1831,最小值为 1831。B 是越秀的 mean 与 min;D 把越秀的 min 误接到天河。
df,按「分区」分组,对「一季度」求和,并说明天河、越秀、黄埔三个结果各代表什么。 答案:from pandas import DataFrame
df = DataFrame({
'姓名': ['赵四', '钱多', '孙冰', '李萌', '周金', '吴达', '郑华', '王军'],
'分区': ['天河', '黄埔', '越秀', '黄埔', '天河', '天河', '黄埔', '越秀'],
'一季度': [2572, 2845, 2100, 4483, 4109, 2435, 4663, 4839],
'二季度': [3291, 3161, 3371, 3810, 2322, 4863, 1831, 1214],
'三季度': [4388, 3723, 3901, 1070, 3056, 1576, 1451, 3639],
'四季度': [2672, 3663, 3024, 2312, 4066, 1934, 3456, 2649]
})
group = df.groupby('分区')
print(group.agg({'一季度': 'sum'}))
结果:天河 9116、越秀 6939、黄埔 11991,分别代表各区所有人一季度业绩的总和。 解析: 评分要点:① 用课程示例创建数据框;② groupby('分区') 得到分组对象;③ agg 传入字典 {'一季度':'sum'}(列标签为键、操作名为值);④ 能说明三个数字是各区一季度总和。漏写 groupby 或把键值写反不得满分。
agg 写法分别对应课程的哪一类用法?(2)黄埔区一季度的 sum、max 各是多少?请列出参与计算的原始值。(3)越秀区二季度的 mean、min 各是多少?为什么 mean 带一位小数?from pandas import DataFrame
df = DataFrame({
'姓名': ['赵四', '钱多', '孙冰', '李萌', '周金', '吴达', '郑华', '王军'],
'分区': ['天河', '黄埔', '越秀', '黄埔', '天河', '天河', '黄埔', '越秀'],
'一季度': [2572, 2845, 2100, 4483, 4109, 2435, 4663, 4839],
'二季度': [3291, 3161, 3371, 3810, 2322, 4863, 1831, 1214],
'三季度': [4388, 3723, 3901, 1070, 3056, 1576, 1451, 3639],
'四季度': [2672, 3663, 3024, 2312, 4066, 1934, 3456, 2649]
})
group = df.groupby('分区')
print(group.agg({'一季度': 'sum'}))
print(group.agg({'一季度': ['sum', 'max']}))
print(group.agg({'一季度': ['sum', 'max'], '二季度': ['mean', 'min']}))
答案: (1)第一种是对一个列标签执行一种聚合;第二种是对一个列标签执行多种聚合;第三种是对多个列标签执行多种聚合(每个列标签和操作构成一个键值对)。 (2)黄埔三人一季度为钱多 2845、李萌 4483、郑华 4663。sum=2845+4483+4663=11991,max=4663。 (3)越秀二人二季度为孙冰 3371、王军 1214。mean=(3371+1214)/2=2292.5,min=1214。越秀只有 2 人,两数之和 4585 不能被 2 整除,故均值出现一位小数。 解析: 评分要点:① 三种用法名称与代码一一对应;② 黄埔原始三人名单及 11991、4663 正确;③ 越秀 mean、min 正确,并能说明 2 人取平均出现 2292.5。只背结果不算过程可酌情扣分。