4.3.3-分组后的数据转换.md

4.3.3 分组后的数据转换(问答库)

  1. 【单选题·易】用 groupby() 分组后做数据转换,课程采用的实现方法是? A. agg 方法 B. merge() 方法 C. transform() 函数 D. concat() 方法 答案:C 解析: 语料明确:分组后的数据转换由 transform() 函数实现。agg 用于聚合汇总,merge/concat 属于合并和连接。
  2. 【单选题·易】调用 transform() 时,课程给出的参数类型是? A. 字典,列标签是键、操作名是值 B. 操作名字符串 C. 分组的列标签 D. 行标签列表 答案:B 解析: 课程说明:transform() 的参数是操作名字符串,示例为 'mean'。字典参数属于上一节 agg 的写法。
  3. 【判断题·易】用 groupby() 对数据进行分组后,还可以通过数据转换来修改或生成新的数据。 答案:√ 解析: 这是 4.3.3 对分组后数据转换的定义。实现上使用 transform() 函数。
  4. 【判断题·易】transform() 将操作应用到每一个分组,转换后返回一个序列。 答案:√ 解析: 语料对功能的表述就是:将操作应用到每一个分组,转换后返回一个序列。
  5. 【多选题·中】关于 transform() 的说法,正确的有: A. 参数是操作名字符串 B. 转换后返回一个序列 C. 每个分组数据在转换后会被应用回原始数据框的相应位置 D. 结果以分组键为行索引,每个组只保留一行 答案:ABC 解析: A、B、C 均来自本节语料。D 描述的是上一节 agg 的结果形态,不是 transform()。
  6. 【单选题·中】执行下列代码,行标签 0 对应的值最接近哪一项?
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['四季度'].transform('mean'))

A. 2890.666667(天河区四季度平均值) B. 3143.666667(黄埔区四季度平均值) C. 2836.500000(越秀区四季度平均值) D. 2672(赵四本人的四季度业绩) 答案:A 解析: 标签 0 是赵四,属于天河。transform('mean') 把该区四季度均值填回原位置,不是填个人原始值。天河三人四季度为 2672、4066、1934,均值约 2890.666667。

  1. 【单选题·中】沿用上题中的转换结果,标签 0、4、5 的值相同,原因是? A. 这三人四季度的原始业绩本来就相同 B. 他们都属于天河,transform() 把该区四季度平均值应用回原始数据框的相应位置 C. 行标签被重建为从 0 开始的连续编号,所以前几行必然相等 D. 这三人一季度的平均值相同,与四季度无关 答案:B 解析: 语料说明:标签 0、4、5 对应的值为四季度天河区的平均值。三人原始四季度分别为 2672、4066、1934,并不相同;行标签仍是原数据框的 0、4、5,并未重建。
  2. 【多选题·中】沿用第 6 题的数据与代码,下列哪些行标签对应黄埔区四季度平均值 3143.666667? A. 1(钱多) B. 2(孙冰) C. 3(李萌) D. 6(郑华) 答案:ACD 解析: 黄埔组为钱多、李萌、郑华,行标签 1、3、6。孙冰(标签 2)属于越秀,对应 2836.5。
  3. 【判断题·中】transform() 与 agg 效果相同,都会把每个组压成一行汇总。 答案:× 解析: agg 把每个组压缩成一行(结果以分区为行索引)。transform() 把操作应用到每一组后对齐回原始各行,返回与原数据框等长的序列。
  4. 【单选题·难】执行下列代码后,王军(行标签 7)对应的转换值是多少?计算依据是什么?
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('分区')
s = group['四季度'].transform('mean')
print(s[7])

A. 2649,即王军本人的四季度业绩 B. 2836.5,即越秀两人四季度 (3024+2649)/2 的平均值 C. 2890.666667,即天河区四季度平均值 D. 3143.666667,即黄埔区四季度平均值 答案:B 解析: 王军属于越秀,越秀还有孙冰。两人四季度为 3024、2649,均值 2836.5。transform 填回的是组均值,不是个人原始值。标签 2 与标签 7 同为 2836.5。

  1. 【简答题·中】请写出完整可运行代码:创建与课程相同的业绩数据框 df,按「分区」分组,对「四季度」做 transform('mean'),并说明行标签 0、4、5 的值代表什么。 答案:
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['四季度'].transform('mean'))

标签 0、4、5 对应赵四、周金、吴达,三人都属于天河,因此这三个位置上的值都是天河区四季度的平均值 2890.666667。 解析: 评分要点:① 用课程示例创建数据框;② groupby('分区') 得到分组对象;③ 按列调用 group['四季度'].transform('mean'),参数为操作名字符串;④ 能说明 0、4、5 是天河组均值填回原位置。漏写取列或把 transform 写成 agg 不得满分。

  1. 【简答题·难】结合下列代码,回答四个问题:(1)transform('mean') 与 agg({'四季度':'mean'}) 在结果形状上有何不同?(2)为什么标签 0、4、5 的值相同,而三人四季度原始值并不相同?(3)黄埔三人四季度原始值各是多少,组均值如何算出?(4)仅执行 transform 会不会改写原数据框 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['四季度'].transform('mean'))
print(group.agg({'四季度': 'mean'}))

答案: (1)transform 返回长度为 8 的序列,行标签仍为 0~7,与原数据框对齐;agg 返回以「分区」为行索引的汇总表,只有天河、越秀、黄埔三行。 (2)标签 0、4、5 是天河三人(赵四、周金、吴达)。transform 把该组四季度均值应用回原始数据框的相应位置,所以这三行得到同一个组均值,而不是各自的原始业绩。 (3)黄埔为钱多 3663、李萌 2312、郑华 3456。均值 (3663+2312+3456)/3=3143.666…,对应标签 1、3、6。 (4)不会。transform 返回新序列,不就地修改 df;要作为新列保存需要赋值。 解析: 评分要点:① 能对比「等长序列 vs 每组一行」;② 点明「应用回原始相应位置」;③ 黄埔三人原始值与 3143.666667 计算正确;④ 说明需赋值才写入数据框。四点答全给满分。

下载此文件