pandas 数据模型:列类型、索引与 CSV 契约
前置:Python CSV与异常。pandas处理带标签的列式数据,DataFrame不是数据库表,也不自动提供主键约束。先回答“一行是什么、每列允许什么、缺失代表什么”,再选择API。本组完整工程销售月报只读取本地CSV,示例未执行。
教学版本与依赖
pandas教学版本如何固定:本组采用已发布的 pandas 2.3.3 与 CPython 3.12,直接依赖同时声明 tzdata,核对日期2026-10-17。这是可复现教学基线,不表示它是当前最新版或长期支持承诺。复制代码时不要混用3.x文档的默认行为;升级须重新检查缺失字符串、groupby和复制语义。安装说明在工程README,本次未安装任何产品依赖。
2.3.3发布记录说明该版本发布于2025-09-29。直接依赖固定不等于完整锁定传递依赖;真实交付还应在目标平台解析并保存锁文件和哈希,本理论包没有伪造安装结果。
标签索引与位置
pandas标签和位置为什么不同:Index是行标签,loc按标签选择,iloc按位置选择;整数标签也不自动等于位置。Series赋给DataFrame列时按标签对齐,排序或筛选后继续使用旧索引可能出现缺失值。业务ID应保留为显式列并单独校验唯一性;RangeIndex只是当前行编号,不是销售主键。
以下为局部解释片段,插入交互环境观察:
import pandas as pd
frame = pd.DataFrame({'value': [10, 20]}, index=['b', 'a'])
frame['other'] = pd.Series([1, 2], index=['a', 'b'])
# 预期 b 行 other=2,a 行 other=1;不是按列表位置赋值。
assert frame.loc['b', 'other'] == 2
assert frame.iloc[0]['value'] == 10用reset_index(drop=True)会丢弃旧标签,必须确认旧标签没有业务含义;用to_numpy绕过标签对齐则把责任转给行顺序,不能当作普遍修复。项目创建整数分Series时原销售表仍是构造所得RangeIndex,两者一致;若先筛选,应明确使用原索引构造Series或重新建立行编号。
可空列与布尔判断
pandas可空整数怎么选择:Int64是可空扩展类型,int64是不可空整数类型;pd.NA表达未知,不能直接把未知当成普通真值。需要缺失整数时显式指定dtype='Int64',检查缺失用isna而不是等号;把可空比较结果用于筛选前先决定未知记录应保留、拒绝还是补默认值。
quantities = pd.Series([1, None], dtype='Int64')
valid = quantities.gt(0).fillna(False)
# 预期筛出第一项;这里业务明确选择丢弃未知,不是通用缺失策略。dtype='string'也比混杂object更能表达文本列;Python对象、数值和字符串混在object里,常常是边界未清理的信号。类型只能表示“能装什么”,不能保证订单唯一、金额非负或客户存在。项目金额列在缺失和范围校验后转int64;region先识别唯一允许的空字符串,再补为unknown,没有把错误金额补零。
可空表示依据:Int64Dtype。
CSV推断与严格模式
pandas读取CSV如何保留前导零:读入阶段显式指定字符串类型,关闭不符合业务的默认NA推断,再验证准确表头与字段数。001是客户标识,不是数值1;NA可能是合法文本,不能因为默认缺失词表而消失。dtype解决列表示,schema解决必填、唯一、范围和字段契约,两者必须分开。
对于已知结构可信CSV,局部调用为 pd.read_csv(path, dtype='string', keep_default_na=False, encoding='utf-8-sig'),随后检查列和业务规则。工程采用标准库csv.reader(strict=True)先检查每一行的字段数,再构造DataFrame,防止畸形CSV被自动解释为索引或缺字段补空;strict不会代替业务检查。限制每表100000行控制教学规模,但不是严格的进程内存限额,单个超长字段仍需上游文件大小管理。
参考:read_csv、索引指南。API默认参数是便捷约定,业务输入契约必须独立写清。
建模练习
给两行销售设置标签100、200,把索引0、1的金额Series赋给新列,预测结果。再判断客户ID“001”和缺失ID能否一律astype(int)。最后为可空优惠金额定义“无优惠”与“金额未知”的差异;不要先看下面答案。
参考解法
标签不匹配使两行新列都缺失;可显式按相同标签创建Series,但只有确认位置契约时才用数组赋值。“001”转整数丢失身份表示,空ID必须拒绝;无优惠可用0分,金额未知应保留NA或拒绝进入财务报表,不能无依据地填零。项目只允许region缺失,因此金额无需可空整数。
继续阅读
- 开发实践
- 排错
- 开发实践