pandas中float64与Float64的区别:NaN为何转为<NA>?
pandas中float64与Float64类型及空值差异解析
你的理解完全正确
float64(小写F)和Float64(大写F)是两种完全不同的数据类型:
float64的空值是np.nan,显示为NaNFloat64的空值是pd.NA,显示为<NA>
底层原理
float64(原生NumPy类型)
这是NumPy提供的原生浮点数类型,属于非可空数值类型。np.nan是一个特殊的浮点数实例,本质仍属于浮点数范畴,但存在逻辑缺陷:比如np.nan == np.nan会返回False,而且如果是整数列出现缺失值,会被强制转为float64类型来容纳np.nan,丢失整数类型语义。Float64(pandas可空扩展类型)
这是pandas 1.0版本后推出的可空数值类型,基于pandas的ExtensionArray架构实现,是pandas自己定义的扩展类型。pd.NA是专门设计的统一缺失值标识,用来解决np.nan的语义缺陷:它支持符合逻辑的缺失值比较(pd.NA == pd.NA返回pd.NA,符合缺失值的不确定性逻辑),同时可以在保留数值类型语义(比如整数、浮点数)的前提下存储缺失值,无需强制转换类型。
转换时的变化原因
当你对全为np.nan的float64列执行astype(pd.Float64DType())转换时,pandas会将NumPy原生类型的缺失值np.nan映射为可空扩展类型对应的pd.NA,同时数据类型从NumPy的float64切换为pandas的Float64,所以显示上从NaN变成了<NA>。
修正后的示例代码
import pandas as pd import numpy as np df = pd.DataFrame({'a': [1.0, 2.0]}) print(df.dtypes) # output is: float64 df['a'] = np.nan print(df.dtypes) # output is float64 print(df) # a # 0 NaN # 1 NaN # 将float64转换为Float64 df['a'] = df['a'].astype(pd.Float64DType()) print(df.dtypes) # output is Float64, 注意首字母为大写F,此前是小写 print(df) # a # 0 <NA> # 1 <NA>
内容的提问来源于stack exchange,提问作者Eugenio.Gastelum96
相关产品推荐
相关产品推荐

