将浮动转换为pandas中的字符串时精度损失

时间:2016-08-03 07:30:48

标签: python string pandas floating-point

我在Python中将一些浮点数(有些更短一些更长)转换为字符串并获得意外(?)结果:

案例1

pd.options.display.float_format = '{:.2f}'.format
pd.DataFrame({'x': [12345.67]})

           x
0   12345.67

案例2

pd.DataFrame({'x': [1234589890808980.67]})

                      x
0   1234589890808980.75

案例3

pd.DataFrame({'x': [1234589890878708980.67]})

                         x
0   1234589890878708992.00

我甚至尝试了dtypes np.float128np.longdouble,但没有用。

有人可以解释一下这里发生了什么,并且在案例2和案例3中是否可以“正确”转换?

谢谢!

1 个答案:

答案 0 :(得分:3)

我害怕这个"问题"发生在Python(而不是pandas)方面。当你有一些像1234589890878708980.67这样的即时值时,它会被识别为float并立即失去精确度,例如:

>>> 1234589890878708980.67
1.234589890878709e+18
>>> 1234589890878708980.67 == 1234589890878708980.6712345
True

您可以尝试使用decimal.Decimal

>>> import decimal
>>> pd.DataFrame({'x': [decimal.Decimal('1234589890808980.67')]})
                     x
0  1234589890808980.67

<强>编辑:

OP在评论中添加了一些问题。

  

但是,我是否理解为了正确使用此方法,该值应该首先是字符串?

是的:)

  

如果它从csv文件读取浮动怎么办?

AFAIK Python的csv读者不得进行任何类型转换,并且您将获得可以在以后自由转换的字符串。否则,如果您正在使用pandas.read_csv,则可以尝试设置dtypefloat_precision参数(您也可以请求pandas加载纯字符串,并让您自己稍后转换值)