pandas 2.0启用pyarrow引擎后,"na"不再自动识别为缺失值,因其严格仅将none和nan映射为pd.na;需在read_csv中用na_values显式声明或先replace再convert_dtypes。

Pandas 2.0 默认启用 PyArrow 引擎后,None、NaN、pd.NA 三者行为不再等价 —— pd.NA 成为统一缺失值标记,而 NaN 仅保留在浮点列中;非标准字符串如 "NA"、"NULL"、空字符串默认不被识别为缺失值,必须显式声明。
为什么 "NA" 不再自动变成 pd.NA
PyArrow 引擎(dtype_backend="pyarrow")严格区分语义:它只将 Python None 和 IEEE 754 NaN 映射为缺失,其余字符串一律视为有效数据。这与旧版 Pandas 的启发式推断(如自动把 "NA" 当作缺失)完全不同。
- 读取 CSV 时,
pd.read_csv(..., dtype_backend="pyarrow")不会解析"NA"字段为缺失,除非你加na_values=["NA", "NULL", ""] - 列中混有
"NA"和数字时,整列会被推断为string[pyarrow]类型,"NA"就是普通字符串,df["col"].isna()对它返回False - 用
df.fillna("missing")无法覆盖这些字符串,因为它们根本不是缺失值
如何让 "NA"、"null" 等真正变成缺失值
必须在数据加载阶段就干预,靠后续 .replace() 或 .map() 无法触发 PyArrow 的缺失语义(它们只改值,不改类型)。
- CSV 场景:用
na_values+keep_default_na=False组合,避免 Pandas 自作主张把"nan"也当缺失pd.read_csv("data.csv", na_values=["NA", "NULL", "N/A", ""], keep_default_na=False, dtype_backend="pyarrow") - 已有 DataFrame:先用
.replace()把目标字符串转成None,再调用.convert_dtypes(dtype_backend="pyarrow")强制重铸类型df = df.replace({"col": {"NA": None, "NULL": None}}).convert_dtypes(dtype_backend="pyarrow") - 注意:
df["col"] = df["col"].replace(...)单独执行不会生效,因为 PyArrow 列是不可变的,必须整列重赋值或调用convert_dtypes
pd.NA 和 NaN 混用时的隐式转换陷阱
开启 PyArrow 后,混合数值列(如 int + float)若含 pd.NA,会自动升格为 Int64[pyarrow] 或 double[pyarrow];但若误写 np.nan 进整数列,Pandas 会静默转成 float64,破坏类型一致性。
- 向整数列插入缺失值,务必用
pd.NA,而非np.nan或None(后者在 PyArrow 下可能被转成字符串) -
df["age"] = df["age"].fillna(pd.NA)安全;df["age"] = df["age"].fillna(np.nan)会导致该列变成float64,且后续.astype("int64[pyarrow]")会失败 - 检查缺失值统一用
df.isna(),不要用df == np.nan—— 后者永远返回False
Arrow 引擎下 dropna() 和 fillna() 的行为差异
参数逻辑没变,但底层判断依据变了:现在完全依赖 Arrow 的 null bitmap,而不是 Pandas 旧式的 object-dtype 推断。
-
df.dropna(subset=["col1", "col2"])只丢弃这两列中任一为pd.NA的行,"NA"字符串不影响结果 -
df.fillna({"col1": 0, "col2": "unknown"})中,若col2是string[pyarrow],填入的"unknown"会被正确存为字符串;但若填None,则变成pd.NA,不是空字符串 - 性能上,Arrow 的
dropna比旧引擎快 3–5 倍,但前提是列已用pd.NA正确标记 —— 错标成字符串就白优化了
最易忽略的一点:PyArrow 引擎不会帮你“猜”业务含义。一个字段里出现 "N/A",可能是缺失值,也可能是用户真实输入的短语。是否归为缺失,必须由你用 na_values 或 replace 显式定义,没有中间态。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











