在python pandas中代表和舍入货币

时间:2016-01-08 16:22:17

标签: python numpy pandas

使用Python Pandas / Numpy中的货币数据,我遇到了#34;意外"由于小数的浮点表示而导致的舍入行为。例如

import numpy as np    
np.round(19.95 * 0.9, 2)
17.949999999999999

按照我在学校学到的小数计算,结果为17.955,所以我希望四舍五入为17.96。

如何在Python Pandas中表示数字以实现"十进制样式"四舍五入?我已经看过Decimal模块和货币包,但我不确定如何有效地将它们与Pandas数据框一起使用。

SOLUTION:

如果有其他人感兴趣,这就是我解决问题的方法:

from decimal import Decimal
import pandas as pd

def float2dec(value):
    "Convert `value` to Decimal cents."
    return Decimal(value).quantize(Decimal('0.01'))

df = pd.DataFrame({'price': [1.90, 1.95, 19.95]})

df['price_reduced'] = (df['price'].map(float2dec) * float2dec(0.9)).map(float2dec)

#    price      price_reduced
#0  1.90        1.71
#1  1.95        1.76
#2  19.95       17.96

另外,我最终使用cdecimal implementation,它使用相同的语法,但速度提高了10倍。

1 个答案:

答案 0 :(得分:4)

您可以在pandas数据帧中使用Decimal类型。一切都应该按预期工作,因为Decimal类型实现了它自己的加法和乘法版本,大熊猫将很乐意在幕后使用sum,cumsum等。

它不会像浮点一样快,但使用精确的十进制表示永远不会与使用浮点一样快。

除非您在程序中遇到性能问题,否则我不担心效率。

http://rhodesmill.org/brandon/2014/pandas-payroll/