为什么Pandas / Numpy自动将9999999999舍入为1.000000e + 10?

时间:2019-04-24 10:07:02

标签: python pandas numpy python-3.6

我有一个Pandas数据框,具有4行,其中一列(名为limit)包含浮点值,其中任何零都必须替换为9999999999(9999999999亿)。该列设置为float32数据类型,我使用pandas.DataFrame.where方法进行替换。但是,由于Numpy将9999999999舍入为10000000000(100亿),因此无法正常工作。

我已经在iPython 3(Python 3.6.8),Pandas版本0.24.2,Numpy版本1.14.0中进行了尝试。

这是替代声明

df['limit'] = df['limit'].where(df['limit'] != 0, 9999999999)

我看到limit的以下列值:

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

1 个答案:

答案 0 :(得分:2)

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

In [24]: np.floor(np.log2(9999999999)) + 1
Out[24]: 34.0

如您所见,您至少需要34位才能显示该数字。因此,您应该使用int64作为表示它的较大数据类型。

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

In [25]: s = pd.Series([9999999999], dtype=pd.np.int32)

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