为何NaN被视为float?pandas转换含NaN序列报错疑问
关于NaN类型与pandas类型转换报错的解答
1. 为什么NaN被归类为float类型?
这得从IEEE 754浮点数标准的定义说起:NaN(Not a Number)本身就是该标准中专门用来表示无效/未定义数值运算结果(比如0÷0、负数开平方)的特殊浮点值。
而整数类型的存储编码规则里,根本没有预留对应NaN的位置——整数只用来表示合法的整数值,不存在“非整数的无效值”这个概念。所以在Python(以及绝大多数编程语言)中,NaN只能以float类型存在。你可以自己验证一下:
print(type(float('nan'))) # 输出 <class 'float'>
2. 为什么pandas转换时会触发ValueError: cannot convert float NaN to integer?
这个报错信息其实完全没问题,咱们拆解一下原因:
- 当你的pandas序列里包含NaN时,该序列的默认数据类型会是
float64——因为普通的整数类型(比如int64)无法存储NaN(前面已经说过整数类型没有NaN的编码)。所以此时序列里的NaN本身就是float类型的对象。 - 当你执行
df.A = df.A.apply(int)时,本质是对序列里的每个元素调用Python内置的int()函数。而int()只能接收合法的数值(比如int(3.5)会转成3,但int(float('nan'))就会直接报错,因为NaN不是一个有效的整数值)。
如果想要在保留NaN的同时把序列转为整数类型,可以使用pandas提供的可空整数类型(注意首字母大写的Int64,区别于小写的int64):
df.A = df.A.astype('Int64')
这个类型既可以存储整数,也能兼容NaN,完美解决你的需求。
内容的提问来源于stack exchange,提问作者user904976
相关产品推荐
相关产品推荐

