Python 为什么Pandas/Numpy会自动将99999999取整为100000e+;10?

Python 为什么Pandas/Numpy会自动将99999999取整为100000e+;10?,python,pandas,numpy,python-3.6,Python,Pandas,Numpy,Python 3.6,我有一个熊猫数据框,有4行,其中一列(名为limit)包含浮点值,其中任何零都必须替换为9999999999(999999999亿)。该列被设置为float32数据类型,我使用pandas.DataFrame.where方法进行替换。但它并没有像预期的那样起作用,因为Numpy正在将999999999凑到1000000000(100亿) 我在iPython3(Python3.6.8)、Pandas版本0.24.2、Numpy版本1.14.0中尝试过这一点 这是替换声明 df['limit'] =

我有一个熊猫数据框,有4行,其中一列(名为
limit
)包含浮点值,其中任何零都必须替换为9999999999(999999999亿)。该列被设置为
float32
数据类型,我使用
pandas.DataFrame.where
方法进行替换。但它并没有像预期的那样起作用,因为Numpy正在将999999999凑到1000000000(100亿)

我在iPython3(Python3.6.8)、Pandas版本0.24.2、Numpy版本1.14.0中尝试过这一点

这是替换声明

df['limit'] = df['limit'].where(df['limit'] != 0, 9999999999)
我看到了
限制的以下列值:

0    1.000000e+10
1    1.000000e+10
2    1.000000e+10
3    1.000000e+10
但我期待着

0    9999999999.0
1    9999999999.0
2    9999999999.0
3    9999999999.0
为什么会发生这种情况?普通Python不会出现这种情况

In [1]: (9.999999999) * 10**9                                                                                                    
Out[1]: 9999999999.0

这仅仅是因为
int32
无法保留该数字。您可以通过计算演示该数字所需的位数来检查这一点:

In [24]: np.floor(np.log2(9999999999)) + 1
Out[24]: 34.0
如您所见,您至少需要34位来演示该数字。因此,您应该使用
int64
作为更大的数据类型来表示它

即使通过将数字放入具有相同数据类型的序列中进行测试,也会再次看到意外结果(溢出):


闻起来像是浮点问题,请参见,但具有适当Pandas/NumPy知识的人应予以确认。32位浮点数不够精确,无法准确表示该数字。这不是Pandas、NumPy或Python的问题,而是()中的一个限制。我认为他们实际上想要使用float32,因为它不能精确地保存该数字,因此“舍入”。
In [25]: s = pd.Series([9999999999], dtype=pd.np.int32)

In [26]: s
Out[26]: 
0    1410065407
dtype: int32