如何在熊猫中进行精确的十进制数计算?

时间:2019-06-17 08:43:00

标签: python pandas decimal

我的数据框看起来像这样:

import pandas as pd
df = pd.read_sql('select * from foo')

a  b  c
0.1 0.2 0.3
0.3 0.4 0.5

如果我直接运行df['a'] * df['b'],则由于浮点数问题,结果将与我预期的不一样。

我尝试了

import Decimal

df['a'].apply(Decimal) * df['b'].apply(Decimal)

但是当我用Pycharm检查df ['a']。apply(Decimal)时,该列证明是奇怪的东西,这里只是一个例子,不是实数:

a
0.09999999999999999
0.30000000000001231

我想知道如何在熊猫中进行精确乘法。

1 个答案:

答案 0 :(得分:0)

问题不在于熊猫,而在于浮点错误:在我的64位系统上,decimal.Decimal(0.1)Decimal('0.1000000000000000055511151231257827021181583404541015625')

一个简单的技巧是首先将浮点数更改为字符串,因为pandas对字符串转换有足够的了解,可以正确舍入值:

x = df['a'].astype(str).apply(Decimal) * df['b'].astype(str).apply(Decimal)

您将获得一个不错的小数系列:

>>> print(x.values)
[Decimal('0.02') Decimal('0.12')]

因此,使用精确十进制操作-如果处理货币值,这可能很重要...