
系列《从小白到 AI 大模型开发工程师的进阶之路》 技术点AI-0236 合并与连接 主人公小蓝伞 前置AI-0233 Pandas Series 与 DataFrame 本期产出独立实验脚本、原始输出、失败样本和验收清单小蓝伞在“合并与连接”的教学实验中遇到一个容易被结果掩盖的问题小蓝伞把两个各三行的表按id连接id一两边都出现两次产生四条组合再加一条未匹配结果成为五行。 同一连接键左右各有多条记录时会产生组合行。连接前定义关系基数连接时用validate校验连接后检查行数与未匹配去重不能替代业务决策。一、小蓝伞遇到的问题同名id只是候选连接字段。要确定它代表用户、订单还是事件以及在哪张表唯一。同一用户多笔订单可以是一对多同一订单重复采集却可能是数据错误。接口应写清实体单位否则看似合法连接会改变报表分母。二、先给结论同一连接键左右各有多条记录时会产生组合行。连接前定义关系基数连接时用validate校验连接后检查行数与未匹配去重不能替代业务决策。推荐先统计重复和类型再声明基数不符合则拒绝或有依据聚合之后复核行数与覆盖。不推荐省略输入语义和指标口径仅凭单次输出扩大结论。成功判据原连接5行id一4组合validate抛MergeError右侧聚合后3行、未匹配1。三、任务与数据契约项目本期约定输入完整代码构造的合成数据输出数值、图表或异常及原始日志环境Windows 11、Python 3.13.9依赖见记录不在范围真实业务、生产容量和跨设备性能四、前置准备在新目录保存工作目录中的实验.py为main.py再执行python -m venv .venv .\.venv\Scripts\python.exe -m pip install numpy2.3.5 pandas2.3.3 .\.venv\Scripts\python.exe main.py本次实际执行使用 Windows 11、Python 3.13.9代码只生成合成输入不依赖账号、令牌或隐藏文件。五、核心原理主键在约定实体表中唯一识别记录的键。基数键在左右两表的重复关系。validate验证连接关系承诺的参数。indicator标注匹配来源的输出字段。多对多同键两边都可有多条记录。组合放大怎样发生左表id一有十、二十两值右表id一有零点八、零点九两值所有可匹配组合都会生成得到四行。左表id二无右匹配在左连接中保留缺失行。输入行数不是输出上限多对多结果可能远大于两表。indicator是覆盖率证据未匹配标记区分两侧都有、仅左和仅右。左连接输出看不到未进入结果的所有右侧记录因此若需双向覆盖需外连接或独立集合差。只检查非空列不能完整评价连接质量特别是零值、缺失和空键可能具有不同含义。去重和聚合不是同义词保留第一条去重可能丢掉有效历史聚合均值可能改变业务时间选择最新又需要可靠时间列。本例用均值仅作为合成修复演示不推荐在真实评分表上无条件照抄。修复必须保留原始记录和选择依据让合并可回滚。六、完整项目完整脚本位于_work/第76期-合并与连接/实验.py。它包含正常、边界和失败断言复制到main.py后可独立运行。import pandas as pd from pandas.errors import MergeError leftpd.DataFrame({id:[1,1,2],a:[10,20,30]}) rightpd.DataFrame({id:[1,1,3],b:[.8,.9,.7]}) resultleft.merge(right,onid,howleft,indicatorTrue) print(result.to_string(indexFalse)) print(输入行数,len(left),len(right),左连接行数,len(result),id1组合数,int((result[id]1).sum())) try: left.merge(right,onid,validateone_to_many) except MergeError: print(validate拒绝左键重复) aggregateright.groupby(id,as_indexFalse)[b].mean() fixedleft.merge(aggregate,onid,howleft,validatemany_to_one,indicatorTrue) print(聚合后行数,len(fixed),未匹配,int((fixed[_merge]left_only).sum())) assert len(fixed)len(left) print(空右表左连接行数,len(left.merge(right.iloc[:0],onid,howleft))) 实现与结果的进一步核验连接前的检查单左右分别统计键类型、缺失、重复数量和样本单位。编号字符串与整数可能不兼容前导零还可能被先前读CSV丢掉。将键格式转换需要明确业务规则不能为了让merge运行就统一转成字符串掩盖原语义差异。连接后的覆盖检验本例id二标记仅左id三只在右表但左连接结果中不出现。报告未匹配时应说明相对于哪张表的分母双向覆盖可以外连接或分别检查键集合。只有总体行数正确也可能把实体错配到同样数量必须抽样核对真实对应。聚合修复的责任右表同键两个评分求均值只是演示。真实数据可能表示两个不同时间、不同来源或重复采集应该分别保留、按时间选最新或拒绝不能默认平均。将修复选择写入数据字典和审计记录比随意drop_duplicates更可追溯。空键的特殊语义Pandas连接中空键行为需核对官方文档不能假定完全等同数据库SQL。业务主键通常不应为空可先拒绝或隔离。若空键代表未知实体把它们互相匹配会制造虚假对应明确策略后再执行连接减少结果正常但含义错误的风险。性能不先于关系正确多对多大表可能在匹配阶段产生巨大输出资源上限应在连接前估算。分块也不能修复错误关系只将放大分成多次发生。先用validate挡住不允许基数再评估索引、排序、内存和输出大小本篇不提供大表性能排名。七、可复现失败案例声明一对多被左侧重复键拒绝多对多放大到5行未匹配id二显式标记。 这是构造的教学失败不是线上事故。复现顺序是保存输入、运行脚本、记录输出、只改一个条件后重跑。修复后必须同时检查正常样本不能用默认值掩盖错误。八、实验设计与实际结果原连接5行id一4组合validate抛MergeError右侧聚合后3行、未匹配1。 本次已经执行退出状态为0完整输出见工作目录。控制变量、样本量和参数写在脚本中。id a b _merge 1 10 0.8 both 1 10 0.9 both 1 20 0.8 both 1 20 0.9 both 2 30 NaN left_only 输入行数 3 3 左连接行数 5 id1组合数 4 validate拒绝左键重复 聚合后行数 3 未匹配 1 空右表左连接行数 3数字怎样对应本期机制声明一对多要求左键唯一示例左键重复会被拒绝。聚合右表后声明多对一输出回到左表三行。校验不是自动修复它只把不满足关系的输入拒绝业务仍需决定哪边聚合、按什么函数、是否允许重复。九、常见问题与排查顺序先检查对象定义再检查输入、形状、分母、索引或时间点最后检查实现与环境。concat按轴拼接merge按关系键匹配join常围绕索引三者不能只按函数短长选择。类型不一致、前导零、空键和索引重叠都需检查。空右表左连接仍保留左行本篇验证该边界避免把没有匹配误当没有输入。 不要把一次成功当成稳定性证明也不要把技术指标直接换成业务价值。十、系统与依赖差异本次只在记录的 Windows 和库版本运行。浮点末位、计时、字体、编码和表格默认行为可能跨环境变化未执行部分保持待核验。十一、验证清单执行脚本核对退出状态与本篇实际输出。重跑本篇正常、边界和失败样本检查数值或拒绝结果。更换数据时重新检查对象、分母和评价条件。验收判据原连接5行id一4组合validate抛MergeError右侧聚合后3行、未匹配1。十二、面试题与追问主键在本期是什么答在约定实体表中唯一识别记录的键。 同名id只是候选连接字段。要确定它代表用户、订单还是事件以及在哪张表唯一。同一用户多笔订单可以是一对多同一订单重复采集却可能是数据错误。接口应写清实体单位否则看似合法连接会改变报表分母。追问改变这个条件后哪一个输出或失败判据应该变化基数在本期是什么答键在左右两表的重复关系。 左表id一有十、二十两值右表id一有零点八、零点九两值所有可匹配组合都会生成得到四行。左表id二无右匹配在左连接中保留缺失行。输入行数不是输出上限多对多结果可能远大于两表。追问改变这个条件后哪一个输出或失败判据应该变化validate在本期是什么答验证连接关系承诺的参数。 声明一对多要求左键唯一示例左键重复会被拒绝。聚合右表后声明多对一输出回到左表三行。校验不是自动修复它只把不满足关系的输入拒绝业务仍需决定哪边聚合、按什么函数、是否允许重复。追问改变这个条件后哪一个输出或失败判据应该变化indicator在本期是什么答标注匹配来源的输出字段。 未匹配标记区分两侧都有、仅左和仅右。左连接输出看不到未进入结果的所有右侧记录因此若需双向覆盖需外连接或独立集合差。只检查非空列不能完整评价连接质量特别是零值、缺失和空键可能具有不同含义。追问改变这个条件后哪一个输出或失败判据应该变化多对多在本期是什么答同键两边都可有多条记录。 保留第一条去重可能丢掉有效历史聚合均值可能改变业务时间选择最新又需要可靠时间列。本例用均值仅作为合成修复演示不推荐在真实评分表上无条件照抄。修复必须保留原始记录和选择依据让合并可回滚。追问改变这个条件后哪一个输出或失败判据应该变化十三、工程判断与下一期先统计重复和类型再声明基数不符合则拒绝或有依据聚合之后复核行数与覆盖。 下一期为AI-0237 Matplotlib 基础。本期保留的契约和反例会继续使用。从本地证据到实际决策重复记录与合法历史同实体多条不一定脏数据可能是多个事件或时间版本。定义主键时可使用复合键也可先按目标窗口选择版本直接按实体去重会丢历史。连接前确认记录层级能防止将用户表与事件表误当同层唯一表。基数校验的持续价值一次validate通过不保证未来输入永远符合数据源新增记录后可能变化。因此把检查放进每次管道入口出错时隔离问题批次并保留摘要。不要为了恢复运行去掉校验这样会让后续指标悄悄变化而无法追踪。输出顺序和字段后缀连接之后记录顺序、同名字段后缀和索引都需检查下游若按位置使用尤其危险。多个同名字段可能来自不同版本不能只删一列让接口通过。保存字段来源映射帮助复核哪一项是真正任务输入。空表和无匹配分开右表为空仍左连接保留三行全部没有匹配左表为空则没有待输出主体。这是不同状态报告应给输入数量和覆盖。业务若要求必须匹配可在连接后主动拒绝而不是把缺失默认成零继续使用。合法数据的回滚聚合修复前保留原表和规则输出记录匹配来源回滚恢复数据版本与连接策略。如果仅恢复输出而继续用新键转换规则下次运行仍可能重现问题。合并脚本和输入契约应作为同一可复现工件。连接复验不能只看输出长度右侧聚合后输出三行只是一个必要检查。还应检查每条左记录保留、聚合评分规则明确、未匹配数量和来源标记。原先id一四条组合缩到两条代表关系从多对多变为多对一而不是程序神奇消除所有数据问题。如果聚合后评分恰好看起来合理也需回到业务说明是否可以平均两个不同事件平均可能不是任何真实事件值。本文保留原表读者可比较每行输入与输出不将这个演示直接作为通用修复规则。真实管道应保存处理版本与被聚合记录数。主键校验、输出行数和抽样对应三类证据一起使用主键校验挡住违反关系的输入行数检查发现规模变化对应核对发现语义错配。它们互补不能挑一项替代全部。修复记录还应写明哪些右侧实体未使用避免将左连接覆盖率称为两表完全匹配。官方资料Merge, join, concatenate and compare — pandas 3.0.6 documentation用于核对本期技术机制或接口查阅日期为2026-10-13。适用边界只覆盖脚本中的合成数据、明确假设和已记录版本。真实业务需追加授权、监控、资源预算、回滚和领域验证。