我有一个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
答案 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