必须在读取阶段就显式控制类型,靠后续astype或convert_dtypes补救往往失效或不彻底;read_csv时用dtype参数硬指定列类型可跳过自动推断,避免前导零丢失、千分位误判、缺失值导致升格为float64等问题。

必须在读取阶段就显式控制类型,靠后续 astype 或 convert_dtypes 补救往往失效或不彻底。
read_csv 时用 dtype 参数硬指定列类型
自动推断是多数隐式转换的源头。比如邮政编码 "00123" 被判为 int64,前导零直接丢;"1,000" 被判为 object,后续无法计算。
- 用
dtype={"user_id": "str", "age": "Int64", "status": "category"}显式声明,跳过推断 -
"Int64"(大写 I)才能存缺失值,"int64"遇到None会静默升格为float64 - 对含千分位、货币符号的数值列,先用
thousands=","或decimal="."参数清洗,再配dtype - 不确定是否含空值?优先设
"Int64"或"boolean",别赌数据“干净”
PyArrow 后端下 na_values 必须显式声明
Pandas 2.0 默认启用 dtype_backend="pyarrow" 后,“NA”、“NULL”、“” 这些字符串不再被自动识别为缺失值,df["col"].isna() 对它们返回 False。
- 读 CSV 时加
na_values=["NA", "NULL", "N/A", ""]和keep_default_na=False,避免和默认的["nan", "NaN"]冲突 - 已有 DataFrame 想补救?不能只
.replace({"NA": pd.NA}),必须跟.convert_dtypes(dtype_backend="pyarrow")重铸类型 -
df["col"] = df["col"].replace(...)单独执行无效——PyArrow 列不可变,整列重赋值或调convert_dtypes才行
链式操作中用 convert_dtypes 做兜底修复
哪怕用了 dtype,.assign()、.loc[] 等操作仍可能触发隐式升格,比如整数列赋 np.nan 变成 float64。
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
立即学习“Python免费学习笔记(深入)”;
- 在链式中间或末尾插入
.convert_dtypes(dtype_backend="numpy_nullable"),它能把float64(含整数+NaN)转回Int64,object转string - 别依赖默认后端:
dtype_backend="numpy_nullable"比"pyarrow"更稳定,且convert_dtypes默认就用它 -
.assign(new_col=lambda df: df.x.astype("Int64"))比.assign(new_col=df.x.astype("Int64"))安全——前者延迟求值,后者立即触发类型推断
警惕 pd.to_numeric 和 astype 的行为差异
astype("int64") 遇到空值或非数字字符直接报错;pd.to_numeric(..., errors="coerce") 会把非法值转为 NaN,但结果仍是 float64,不是你想要的整数。
- 要可空整数:先
pd.to_numeric(col, errors="coerce"),再.convert_dtypes(),或一步到位.astype("Int64")(前提是已无非法字符串) - 时间列别靠
to_datetime自动推断,写死format参数,比如format="%Y-%m-%d",否则 "01/02/2023" 可能被当成 1 月 2 日而非 2 月 1 日 - category 类型只在低基数列(
nunique() / len() )才省空间,高基数列反而拖慢 <code>.str操作和merge
最易被忽略的是:PyArrow 后端下,None、np.nan、pd.NA 三者语义不同,混用会导致列类型意外变更或聚合结果含 <na></na> 而非标量——检查缺失值永远用 df.isna(),别用 == np.nan。

















