跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

Pandas 2.0中Python怎么处理非标准缺失值_使用Arrow引擎的新null机制

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
,破坏类型一致性。 Python 3.14.3 微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。 下载 立即学习 “ Python免费学习笔记(深入) ”; 向整数列插入缺失值,务必用
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
显式定义,没有中间态。

相关文章