在pandas
中,当我们尝试将包含NaN
值的系列投放到整数时,使用下面的代码段
df.A = df.A.apply(int)
,我经常看到错误消息
ValueError: cannot convert float NaN to integer
我知道NaN
值无法转换为整数。但我很好奇在这种情况下引发的ValueError
。它表示 float NaN无法转换为整数。
为什么NaN
值被视为float对象有什么特定原因吗?或者这是显示错误消息的某些问题的情况?
答案 0 :(得分:5)
简短回答是IEEE 754将NaN
指定为float
值。
至于将pd.Series
转换为特定数字数据类型应该怎么做,我更倾向于尽可能使用pd.to_numeric
。以下示例说明了原因。
import pandas as pd
import numpy as np
s = pd.Series([1, 2.5, 3, 4, 5.5]) # s.dtype = float64
s = s.astype(float) # s.dtype = float64
s = pd.to_numeric(s, downcast='float') # s.dtype = float32
t = pd.Series([1, np.nan, 3, 4, 5]) # s.dtype = float64
t = t.astype(int) # ValueError
t = pd.to_numeric(t, downcast='integer') # s.dtype = float64
u = pd.Series([1, 2, 3, 4, 5, 6]) # s.dtype = int64
u = u.astype(int) # s.dtype = int32
u = pd.to_numeric(u, downcast='integer') # s.dtype = int8
答案 1 :(得分:5)
值得思考说任何数字意味着什么"是"一个float
。在CPython中,float
类型是使用C中的double
实现的,这意味着它们使用IEEE 754双精度。
在该标准中,有一些特定的比特序列对应于可以在系统中表示的每个浮点数(注意,不能表示上限和下限之间的所有可能的数字)。
此外,还有一些特殊的比特序列与#34;常规"不对应。数字因此无法转换为整数。
NaN
:一个安静的NaN
(qNaN
)和一个信号NaN
(sNaN
)。要使用此类值构建float
,您可以使用此调用:
nan = float('nan')
inf = float('inf')
将这些值传递给int
构造函数时,您可以看到相同的错误:
>>> int(nan)
ValueError: cannot convert float NaN to integer
>>> int(inf)
OverflowError: cannot convert float infinity to integer