☰
【第73期】两列同长度相加却出现NaN:索引、dtype与CSV往返完整教程
2026/11/4 7:05:19 网站建设 项目流程

系列:《从小白到 AI 大模型开发工程师的进阶之路》 技术点:AI-0233 Pandas Series 与 DataFrame 主人公:小蓝伞 前置:AI-0231 NumPy 数组 本期产出:独立实验脚本、原始输出、失败样本和验收清单

小蓝伞在“Pandas Series 与 DataFrame”的教学实验中遇到一个容易被结果掩盖的问题:小蓝伞把索引为a、b的两值与b、c的两值相加,结果只有b能对应,索引并集出现三个位置。 Pandas算术按索引标签对齐,不按位置配对。CSV不能完整保留表格类型,标识符前导零和可空整数要在读取入口显式声明。

一、小蓝伞遇到的问题

Series是一维带标签数据,DataFrame把列和行索引组织成表格。标签不只是显示装饰,它参与选择、对齐和连接。表里两列行数相同不意味着同一个位置代表同一个实体;理解标签语义是避免静默错配的前提。

二、先给结论

Pandas算术按索引标签对齐,不按位置配对。CSV不能完整保留表格类型,标识符前导零和可空整数要在读取入口显式声明。

  • 推荐:实体关系按标签,纯位置运算显式选择;读CSV锁定关键类型并做往返核验。

  • 不推荐:省略输入语义和指标口径,仅凭单次输出扩大结论。

  • 成功判据:b=21,a/c为缺失;位置结果[11,22];CSV标识001保留、count为Int64;不存在标签抛出KeyError。

三、任务与数据契约

项目本期约定
输入完整代码构造的合成数据
输出数值、图表或异常及原始日志
环境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;代码只生成合成输入,不依赖账号、令牌或隐藏文件。

五、核心原理

  • 索引:记录标签及其对齐语义。

  • loc:按标签选择。

  • iloc:按位置选择。

  • 可空整数:保留整数语义同时表示缺失的类型。

  • CSV往返:保存后再读取并核对语义。

相加时发生并集对齐

左侧十、二十对应a、b,右侧一、二对应b、c。标签相加得到b为二十一,a与c缺少另一侧值形成缺失。按位置数组相加则是十一、二十二。两个结果都可能在某任务中有意义,但必须选择正确语义,不能为了消除缺失就无条件转换成数组。

CSV往返的类型损失

本例标识符是零零一、零零二,可空计数为二和缺失。保存后以字符串和可空整数类型读取,前导零与缺失保持。若由默认推断把标识符读成整数,就失去显示与匹配语义;如果空计数变浮点,后续接口也可能产生格式不一致。

表格入口要做什么检查

读取后检查列名、类型、主键、重复、缺失和样本数量。时间列还需时区与格式约定,分类列需未知类别策略。CSV格式没有完整数据库约束,文件存在不等于数据有效;边界报告能防止问题进入统计或训练。

六、完整项目

完整脚本位于_work/第73期-Pandas Series 与 DataFrame/实验.py。它包含正常、边界和失败断言;复制到main.py后可独立运行。

import pandas as pd from pathlib import Path left=pd.Series([10,20],index=["a","b"]) right=pd.Series([1,2],index=["b","c"]) print("标签相加",left.add(right).to_dict()) print("位置相加",(left.to_numpy()+right.to_numpy()).tolist()) frame=pd.DataFrame({"id":pd.Series(["001","002"],dtype="string"),"count":pd.Series([2,None],dtype="Int64")}) frame.to_csv("sample.csv",index=False,encoding="utf-8") restored=pd.read_csv("sample.csv",dtype={"id":"string","count":"Int64"}) print("CSV往返",restored.to_dict("list"),"dtypes",{k:str(v) for k,v in restored.dtypes.items()}) assert restored["id"].iloc[0]=="001" and str(restored["count"].dtype)=="Int64" print("loc标签b",left.loc["b"],"iloc位置1",left.iloc[1]) try: left.loc["missing"] except KeyError: print("不存在的标签被拒绝") ​

实现与结果的进一步核验

往返不是只检查文件存在

保存CSV后按明确类型读取,核对编号字符串、缺失数量、列顺序和记录数量,再验证特定值。文件非空不能证明保存正确,编辑器打开看到内容也不能证明类型保持。脚本包含合成编号与可空整数,以小表说明读取契约的必要性。

缺失来自对齐还是采集

索引并集相加产生缺失,是另一侧没有对应标签,不是源文件忘填数值。处理前应追踪缺失来源,不能直接用零填满改变统计。实体对应本来错误时,填值只是让结果看起来完整;正确做法是核对索引和连接关系。

排序后位置语义会变

标签稳定时按标签选择仍同实体,位置选择则随排序变化。若任务需要逐条对应两个来源,应验证主键,而不是假定排序一致。重置索引可以简化位置运算,但也丢掉原标签,最好保留为独立列以便审计。

可空类型为何有用

计数可以缺失却仍保持整数语义,避免输出二点零或把空值强制成零。缺失与零含义不同,后续聚合的count和size也不同。版本间默认字符串行为可能变化,本篇显式类型防止依赖隐含推断。读者切换版本应先运行同一小表。

保存路径和编码边界

UTF-8保存中文数据,读取方仍需正确声明编码。复杂类型如带时区时间、类别元数据和嵌套对象不由CSV完整承载,必要时评估适合格式。本文不比较格式性能,只把关键字段类型和标签对齐变成可观察验收。

七、可复现失败案例

同长度不同标签相加出现缺失是正常对齐;不存在标签拒绝;前导零必须保留。 这是构造的教学失败,不是线上事故。复现顺序是保存输入、运行脚本、记录输出、只改一个条件后重跑。修复后必须同时检查正常样本,不能用默认值掩盖错误。

八、实验设计与实际结果

b=21,a/c为缺失;位置结果[11,22];CSV标识001保留、count为Int64;不存在标签抛出KeyError。 本次已经执行,退出状态为0;完整输出见工作目录。控制变量、样本量和参数写在脚本中。

标签相加 {'a': nan, 'b': 21.0, 'c': nan} 位置相加 [11, 22] CSV往返 {'id': ['001', '002'], 'count': [2, None]} dtypes {'id': 'string', 'count': 'Int64'} loc标签b 20 iloc位置1 20 不存在的标签被拒绝

数字怎样对应本期机制

标签选择寻找名为b的记录,位置选择寻找第二条记录,本例恰好相同。换排序后它们可能不同,整数标签尤其容易混淆。不存在标签报错有助发现契约失效,不应自动返回其他位置。切片边界和布尔筛选也应根据实际版本文档检查。

九、常见问题与排查顺序

先检查对象定义,再检查输入、形状、分母、索引或时间点,最后检查实现与环境。只需要按位置时可显式重置索引或取数组,同时记录为什么实体关系不靠标签。赋值时同样需要考虑标签对齐,不能只在加法里关注。本文输出文件位于练习目录,只有合成数据;下期清洗会在保留这些契约的前提下处理缺失和异常。 不要把一次成功当成稳定性证明,也不要把技术指标直接换成业务价值。

十、系统与依赖差异

本次只在记录的 Windows 和库版本运行。浮点末位、计时、字体、编码和表格默认行为可能跨环境变化;未执行部分保持待核验。

十一、验证清单

  • 执行脚本,核对退出状态与本篇实际输出。

  • 重跑本篇正常、边界和失败样本,检查数值或拒绝结果。

  • 更换数据时重新检查对象、分母和评价条件。

  • 验收判据:b=21,a/c为缺失;位置结果[11,22];CSV标识001保留、count为Int64;不存在标签抛出KeyError。

十二、面试题与追问

  1. 索引在本期是什么?

    答:记录标签及其对齐语义。 Series是一维带标签数据,DataFrame把列和行索引组织成表格。标签不只是显示装饰,它参与选择、对齐和连接。表里两列行数相同不意味着同一个位置代表同一个实体;理解标签语义是避免静默错配的前提。

    追问:改变这个条件后,哪一个输出或失败判据应该变化?

  2. loc在本期是什么?

    答:按标签选择。 左侧十、二十对应a、b,右侧一、二对应b、c。标签相加得到b为二十一,a与c缺少另一侧值形成缺失。按位置数组相加则是十一、二十二。两个结果都可能在某任务中有意义,但必须选择正确语义,不能为了消除缺失就无条件转换成数组。

    追问:改变这个条件后,哪一个输出或失败判据应该变化?

  3. iloc在本期是什么?

    答:按位置选择。 标签选择寻找名为b的记录,位置选择寻找第二条记录,本例恰好相同。换排序后它们可能不同,整数标签尤其容易混淆。不存在标签报错有助发现契约失效,不应自动返回其他位置。切片边界和布尔筛选也应根据实际版本文档检查。

    追问:改变这个条件后,哪一个输出或失败判据应该变化?

  4. 可空整数在本期是什么?

    答:保留整数语义同时表示缺失的类型。 本例标识符是零零一、零零二,可空计数为二和缺失。保存后以字符串和可空整数类型读取,前导零与缺失保持。若由默认推断把标识符读成整数,就失去显示与匹配语义;如果空计数变浮点,后续接口也可能产生格式不一致。

    追问:改变这个条件后,哪一个输出或失败判据应该变化?

  5. CSV往返在本期是什么?

    答:保存后再读取并核对语义。 读取后检查列名、类型、主键、重复、缺失和样本数量。时间列还需时区与格式约定,分类列需未知类别策略。CSV格式没有完整数据库约束,文件存在不等于数据有效;边界报告能防止问题进入统计或训练。

    追问:改变这个条件后,哪一个输出或失败判据应该变化?

十三、工程判断与下一期

实体关系按标签,纯位置运算显式选择;读CSV锁定关键类型并做往返核验。 下一期为AI-0234 缺失值与异常值。本期保留的契约和反例会继续使用。

从本地证据到实际决策

标签重复的额外条件

索引可以重复,不等于主键必然唯一。算术、选择或连接在重复标签下的行为需单独核验,业务要求唯一时主动检查。只有行数一致不能识别重复实体,标签集合一致也不保证每个标签对应同一数量记录。

缺失的输出契约

a和c缺少一侧值,因此结果缺失有明确来源。如果业务定义缺少一侧视为零,可使用声明的填充策略;否则保持缺失提示待核对。不能为了图表没有空格就悄悄填值,让读者误以为所有配对都真实存在。

选择与修改的版本问题

表格修改行为可能随版本和复制策略变化,应优先用明确行列选择赋值,并在同一版本做最小实验。链式选择看起来短,却可能让所有权含混。本文没有运行所有修改模式,不把某版本经验当永久规则。

输入读取的失败顺序

先确认编码和分隔格式,再核对列名、关键类型、标识符和缺失。若编号已被上游数值化失去前导零,读成字符串也不自动恢复原信息。应回到来源契约而非猜长度补零;这种修复影响实体对应,需业务依据。

表格契约怎样保存

除了CSV本身,保存字段名、dtype、单位、允许缺失、主键和版本。这样其他人读取后能验证,不必猜默认推断。当前实验输出类型字典和往返样本,构成最小契约;真实业务再加时区、分类范围和数据授权。

读写表格的完整验收顺序

先运行脚本生成两行CSV,再打开保存文件确认编号以字符串格式输出;重新读取后检查类型字典、前导零、缺失计数和索引含义。不要把序列化前对象的dtype当成读取后的dtype证据。CSV自身没有保留全部元数据,检查动作必须发生在读取之后。

如果下游要求固定列集合,额外列与缺列应分别处理,不能只按位置选前两列。列重排通常合法,但位置读取可能错误;标识符重命名需要同步数据字典,不能靠字符串拼写相似就认为同实体。空文件、表头不一致和重复主键应有独立入口判据。本文不假装执行了所有文件故障,只给已运行往返和标签失配例作为可重建基线。

再把标签相加与位置相加放在同一输入对照,能明确缺失来自关系而不是采集。用户换数据前应先解释哪种关系符合任务,之后选择操作。得到三个标签的结果可以完全正确,得到两条位置结果也可能完全错误,判断依靠语义而不是结果行数是否好看。

官方资料

  • Indexing and selecting data — pandas 3.0.6 documentation:用于核对本期技术机制或接口,查阅日期为2026-10-13。

适用边界

只覆盖脚本中的合成数据、明确假设和已记录版本。真实业务需追加授权、监控、资源预算、回滚和领域验证。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询