系列:《从小白到 AI 大模型开发工程师的进阶之路》 技术点:AI-0235 分组、聚合与透视 主人公:小蓝伞 前置:AI-0233 Pandas Series 与 DataFrame 本期产出:独立实验脚本、原始输出、失败样本和验收清单
小蓝伞在“分组、聚合与透视”的教学实验中遇到一个容易被结果掩盖的问题:小蓝伞对三组均值无权平均得到五十五,而四条记录真实均值四十五。程序没有报错,错误发生在统计口径。 各组样本量不同时,组均值需要按有效计数加权。统计报告的分母、缺失组、缺失值和重复记录必须明确,透视表只是展示方式。
一、小蓝伞遇到的问题
均值由总和除以有效计数得到,只保存均值丢失分母信息。A组两条十和二十均值十五,B组一条一百,缺失组一条五十。三个组均值直接平均为五十五,按组有效数量加权则为四十五,与总体相同。
二、先给结论
各组样本量不同时,组均值需要按有效计数加权。统计报告的分母、缺失组、缺失值和重复记录必须明确,透视表只是展示方式。
推荐:报告保留总和、有效计数和行数;缺失组显式声明;跨组或跨天合并从统计状态重算。
不推荐:省略输入语义和指标口径,仅凭单次输出扩大结论。
成功判据:组计数总和等于4;加权与总体均值45一致;组均值无权平均55;空表返回空。
三、任务与数据契约
| 项目 | 本期约定 |
|---|---|
| 输入 | 完整代码构造的合成数据 |
| 输出 | 数值、图表或异常及原始日志 |
| 环境 | Windows 11、Python 3.13.9,依赖见记录 |
| 不在范围 | 真实业务、生产容量和跨设备性能 |
四、前置准备
在新目录保存工作目录中的实验.py为main.py,再执行:
python -m venv .venv .\.venv\Scripts\python.exe -m pip install numpy==2.3.5 pandas==2.3.3 .\.venv\Scripts\python.exe main.py
本次实际执行使用 Windows 11、Python 3.13.9;代码只生成合成输入,不依赖账号、令牌或隐藏文件。
五、核心原理
聚合:按定义将多条记录合成摘要。
sum:有效数值的总和。
count:指定列的有效值数量。
size:组内记录数量。
加权均值:按声明权重合并均值。
count与size回答不同问题
有效值计数通常忽略值列缺失,组大小计算组中的记录数。若数据含空分数,它们会不同,选择哪一个取决于报告问题。金额总和、订单数、有效金额记录数也不能互相替代;先写统计单位和过滤规则,再执行聚合。
透视并不修复定义
透视表将分组结果按行列显示,聚合函数仍决定含义。重复键会需要聚合,简单透视可能拒绝重复。为缺失组显示unknown方便阅读,但必须说明它由缺失标签转换,不能和真实名为unknown的类别无区分合并。
重复事件与权重
同一个订单重复采集会同时改变总和和计数,均值有时变化小,却不是正确报告。按不同样本权重统计也需明确权重单位,不能把记录条数当曝光次数。合并多天结果时保留足够统计状态,避免逐天平均掩盖大小变化。
六、完整项目
完整脚本位于_work/第75期-分组、聚合与透视/实验.py。它包含正常、边界和失败断言;复制到main.py后可独立运行。
import pandas as pd frame=pd.DataFrame({"team":["A","A","B",None],"score":[10.,20.,100.,50.]}) group=frame.groupby("team",dropna=False).agg(total=("score","sum"),count=("score","count"),rows=("score","size"),mean=("score","mean")) print(group.to_string()) print("组均值的均值",group["mean"].mean(),"总体均值",frame["score"].mean(),"加权均值",group["total"].sum()/group["count"].sum()) pivot=frame.assign(team=frame["team"].fillna("unknown")).pivot_table(index="team",values="score",aggfunc=["sum","count"]) print("透视",pivot.to_string()) assert group["count"].sum()==len(frame) empty=frame.iloc[:0].groupby("team").size() assert empty.empty print("空表分组为空;缺失分组显式保留") 实现与结果的进一步核验
把四条记录手算到结果
A总和三十、计数二,B总和一百、计数一,缺失组总和五十、计数一。总和一百八十除计数四得到四十五;组均值十五、一百、五十直接平均五十五。将这些数写出来有助定位口径,而不是以库函数正确为理由接受任何汇总。
聚合状态的可合并性
总和与计数可以跨分片相加,均值不能无权相加。最小最大也有各自合并规则,精确中位数不能只保存各组中位数就恢复全体中位数。分布式或按天统计时应先决定哪些状态足够,不把所有聚合指标都套同一个合并公式。
空值与分母示例的延伸
如果某组两行只有一条分数,size为二而count为一。人均指标是否把缺分当零,要由业务定义,库默认忽略缺失不能自动解释为真实平均。报告可以同时输出有效比例和计数,帮助读者判断不同组均值是否有同样证据强度。
透视表的列层级
多个聚合函数会形成层级列,导出CSV或接口前应声明扁平化命名规则。否则sum-score与count-score丢掉层级后可能同名。透视只是呈现,最终表还需要单位、期间和过滤条件;图表拿到汇总后也不能自动补这些语义。
统计报告与验证
检查组大小之和对应输入、总和一致、均值可由状态重算、缺失组策略明确。若不一致,按筛选、去重、连接和分组逐步核对,每步记录行数。下一期连接可能改变输入基数,先确认事件单位才能防止合并后重复统计。
七、可复现失败案例
无权平均55与总体45不一致;缺失组排除会改变总体;空表无结果。 这是构造的教学失败,不是线上事故。复现顺序是保存输入、运行脚本、记录输出、只改一个条件后重跑。修复后必须同时检查正常样本,不能用默认值掩盖错误。
八、实验设计与实际结果
组计数总和等于4;加权与总体均值45一致;组均值无权平均55;空表返回空。 本次已经执行,退出状态为0;完整输出见工作目录。控制变量、样本量和参数写在脚本中。
total count rows mean team A 30.0 2 2 15.0 B 100.0 1 1 100.0 NaN 50.0 1 1 50.0 组均值的均值 55.0 总体均值 45.0 加权均值 45.0 透视 sum count score score team A 30.0 2 B 100.0 1 unknown 50.0 1 空表分组为空;缺失分组显式保留
数字怎样对应本期机制
分组键缺失不代表这行不存在。脚本明确保留缺失组并检查各组计数和等于输入行数。如果使用默认策略排除缺失键,总体就换了;报告应注明排除比例与理由,不把它称为全量结果。缺失值处理与缺失键处理是两个轴上的问题。
九、常见问题与排查顺序
先检查对象定义,再检查输入、形状、分母、索引或时间点,最后检查实现与环境。空表分组为空是合法边界,不能凭空产生总体均值。类别类型还可能带来未观察到的组,需核对实际版本的observed和缺失策略。本篇不依赖隐含默认,后续连接会检验键的基数,保证聚合与合并具有一致单位。 不要把一次成功当成稳定性证明,也不要把技术指标直接换成业务价值。
十、系统与依赖差异
本次只在记录的 Windows 和库版本运行。浮点末位、计时、字体、编码和表格默认行为可能跨环境变化;未执行部分保持待核验。
十一、验证清单
执行脚本,核对退出状态与本篇实际输出。
重跑本篇正常、边界和失败样本,检查数值或拒绝结果。
更换数据时重新检查对象、分母和评价条件。
验收判据:组计数总和等于4;加权与总体均值45一致;组均值无权平均55;空表返回空。
十二、面试题与追问
聚合在本期是什么?
答:按定义将多条记录合成摘要。 均值由总和除以有效计数得到,只保存均值丢失分母信息。A组两条十和二十均值十五,B组一条一百,缺失组一条五十。三个组均值直接平均为五十五,按组有效数量加权则为四十五,与总体相同。
追问:改变这个条件后,哪一个输出或失败判据应该变化?
sum在本期是什么?
答:有效数值的总和。 有效值计数通常忽略值列缺失,组大小计算组中的记录数。若数据含空分数,它们会不同,选择哪一个取决于报告问题。金额总和、订单数、有效金额记录数也不能互相替代;先写统计单位和过滤规则,再执行聚合。
追问:改变这个条件后,哪一个输出或失败判据应该变化?
count在本期是什么?
答:指定列的有效值数量。 分组键缺失不代表这行不存在。脚本明确保留缺失组并检查各组计数和等于输入行数。如果使用默认策略排除缺失键,总体就换了;报告应注明排除比例与理由,不把它称为全量结果。缺失值处理与缺失键处理是两个轴上的问题。
追问:改变这个条件后,哪一个输出或失败判据应该变化?
size在本期是什么?
答:组内记录数量。 透视表将分组结果按行列显示,聚合函数仍决定含义。重复键会需要聚合,简单透视可能拒绝重复。为缺失组显示unknown方便阅读,但必须说明它由缺失标签转换,不能和真实名为unknown的类别无区分合并。
追问:改变这个条件后,哪一个输出或失败判据应该变化?
加权均值在本期是什么?
答:按声明权重合并均值。 同一个订单重复采集会同时改变总和和计数,均值有时变化小,却不是正确报告。按不同样本权重统计也需明确权重单位,不能把记录条数当曝光次数。合并多天结果时保留足够统计状态,避免逐天平均掩盖大小变化。
追问:改变这个条件后,哪一个输出或失败判据应该变化?
十三、工程判断与下一期
报告保留总和、有效计数和行数;缺失组显式声明;跨组或跨天合并从统计状态重算。 下一期为AI-0236 合并与连接。本期保留的契约和反例会继续使用。
从本地证据到实际决策
报告单位的例子
统计用户平均与订单平均不一样,多订单用户会在订单口径获得更大权重。分组前写出一行表示什么,避免按字段方便选择分母。聚合后的每组一行也不意味每组具有同等业务权重,权重必须从任务定义推导。
时间段合并的具体规则
每天总和与有效计数可累计到月份,再除得月均值;每天均值直接平均会让小量日期和大批日期同权。遇到缺失日,需判断零业务或未采集,不能把未采集当零。保存聚合状态让后续报表能解释这类差异。
计数与质量一起报告
同组平均分相同但有效计数不同,证据强度不同;缺失比例也会影响可比性。报告展示count、size和缺失率可帮助读者发现均值背后信息不足。不要因为表格窄就删掉全部分母,必要时分成摘要与质量表。
类别与缺失的参数核验
类别型分组可能含未观察类别,缺失键又受独立参数控制。按实际库版本明确设置,避免升级后组数变化被误认为业务变化。本文使用显式缺失策略,并用计数和校验控制输入去向,不凭默认值做全量承诺。
从统计到图表的审查
图中柱高可能是均值、总和或计数,要继承汇总表的单位与分母。图表排序和过滤也会改变展示人群,图注应说明。统计正确但图面省略条件仍可能误导,后续可视化篇会把这些参数列入导出验收。
业务报告怎样形成完整工件
报告不仅保存表面均值,还应保存生成脚本、字段字典、输入版本、过滤策略和计数。对本例可从四条原记录逐组核对总和与分母,再用透视表展示同一统计,确认呈现变化没有改变计算。导出时不要让层级列被无说明截平,字段名应说明聚合函数和单位。
如果另一份报告均值差十点,先比较单位和有效记录数量,再比较缺失组、过滤、连接和聚合函数。不要先归咎于浮点误差,因为本例差异来自明确分母。修复后用原四条记录验证总体与加权均值相同,再换授权数据;结果接近不证明定义正确,定义一致才允许数值比较。
空结果也要包含状态和口径,而不是补一个零均值。没有记录与有记录平均零是两种事实,后续图表或模型可能据此做不同决策。明确这一项能避免合法空表被误读成业务下降。
官方资料
Group by: split-apply-combine — pandas 3.0.6 documentation:用于核对本期技术机制或接口,查阅日期为2026-10-13。
适用边界
只覆盖脚本中的合成数据、明确假设和已记录版本。真实业务需追加授权、监控、资源预算、回滚和领域验证。