使用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倍。
答案 0 :(得分:4)
您可以在pandas数据帧中使用Decimal类型。一切都应该按预期工作,因为Decimal类型实现了它自己的加法和乘法版本,大熊猫将很乐意在幕后使用sum,cumsum等。
它不会像浮点一样快,但使用精确的十进制表示永远不会与使用浮点一样快。
除非您在程序中遇到性能问题,否则我不担心效率。