跳到主要内容

DataFrame 加载与检查

读取表格前,先明确需要哪些列、各列的值表示什么,以及哪些内容算缺失值。这些约定构成表格的数据模式(schema)。下面的订单示例把编号读成字符串,保留 "001" 的前导零,并把 created_at 解析为日期。读入后,还要检查 DataFrame 是否符合这些约定。

from io import StringIO
import pandas as pd

orders = pd.read_csv(
StringIO("order_id,customer_id,created_at,amount\n"
"001,C1,2026-01-02,120.50\n"
"002,C2,2026-01-03,0\n"),
usecols=["order_id", "customer_id", "created_at", "amount"],
dtype={"order_id": "string", "customer_id": "string"},
parse_dates=["created_at"],
na_values=["", "NA", "null"],
)

数据读取检查清单

  1. 确认分隔符、编码、表头、小数点约定及缺失值标记。
  2. 仅选取必要列,并在类型推断不可靠时显式指定语义类型。
  3. 显式解析日期,随后明确处理时区定位或转换。
  4. 检查 shapeheadinfo、重复键及缺失值分布。
  5. 对下游阶段依赖的关键不变量进行断言。
assert orders["order_id"].notna().all()
assert orders["order_id"].is_unique
assert orders["amount"].notna().all()
assert orders["amount"].ge(0).all()

索引选择

除非领域键确实能提升查询效率或对齐效果,否则保留默认的 RangeIndex。键也可以保留为普通列:

orders = orders.set_index("order_id", verify_integrity=True)
orders = orders.reset_index()

切勿仅因为某个非唯一业务字段“看起来像” ID,就将其设为索引。

边界处重命名

在数据入口附近一次性规范化列名:

orders = orders.rename(columns=str.strip)
orders.columns = orders.columns.str.lower().str.replace(" ", "_", regex=False)

若需追溯外部原始名称,请保留一份映射关系。

规模边界

当数据块可独立进行增量聚合时,使用 chunksize。如果工作流涉及超出内存限制的全表 Join 或 Shuffle,更换执行引擎通常比维护复杂的分块逻辑更优。

读取行为

read_csv 可接收路径,也可接收上面的内存文件对象 StringIO。本例返回形状为 (2, 4) 的 DataFrame;orders["order_id"].tolist()["001", "002"],前导零得到保留。相对路径以进程工作目录为基准。设置 chunksize 后,返回的是逐块产生 DataFrame 的迭代器。

na_values 会补充默认缺失标记,而非替换它们。如果 "NA" 是合法标识符,应使用 keep_default_na=False 并明确列出缺失标记。parse_dates 遇到无法解析的列可能保留文本类型;检查 dtype,或在必须成功时使用 pd.to_datetime(..., errors="raise")。规范化列名可能产生重名,之后需检查 orders.columns.is_unique。示例可用断言,但 Python 的 -O 会禁用断言;必须执行的边界校验应显式抛出异常。

参考资料

探索关联打开关联网络