为什么NaN被视为浮动?

时间:2018-02-01 09:09:24

标签: python pandas numpy

pandas中,当我们尝试将包含NaN值的系列投放到整数时,使用下面的代码段

df.A = df.A.apply(int),我经常看到错误消息

ValueError: cannot convert float NaN to integer

我知道NaN值无法转换为整数。但我很好奇在这种情况下引发的ValueError。它表示 float NaN无法转换为整数。

为什么NaN值被视为float对象有什么特定原因吗?或者这是显示错误消息的某些问题的情况?

2 个答案:

答案 0 :(得分:5)

简短回答是IEEE 754NaN指定为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:一个安静的NaNqNaN)和一个信号NaNsNaN)。

要使用此类值构建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