【问题标题】:Wrong decimal calculations with pandas使用熊猫进行错误的十进制计算
【发布时间】:2013-08-11 10:01:21
【问题描述】:

我在 pandas 中有一个包含四列的数据框 (df),我想要一个新列来表示这四列的平均值:df['mean']= df.mean(1)

  1    2    3    4   mean 
NaN  NaN  NaN  NaN      NaN  
5.9  5.4  2.4  3.2    4.225  
0.6  0.7  0.7  0.7    0.675  
2.5  1.6  1.5  1.2    1.700  
0.4  0.4  0.4  0.4    0.400 

到目前为止一切顺利。但是,当我将结果保存到 csv 文件时,我发现:

5.9,5.4,2.4,3.2,4.2250000000000005
0.6,0.7,0.7,0.7,0.6749999999999999
2.5,1.6,1.5,1.2,1.7
0.4,0.4,0.4,0.4,0.4

我想我可以强制平均列中的格式,但知道为什么会发生这种情况吗?

我正在将 winpython 与 python 3.3.2 和 pandas 0.11.0 一起使用

【问题讨论】:

标签: python pandas


【解决方案1】:

您可以使用float_format 参数:

import pandas as pd
import io

content = '''\
1    2    3    4   mean 
NaN  NaN  NaN  NaN      NaN  
5.9  5.4  2.4  3.2    4.225  
0.6  0.7  0.7  0.7    0.675  
2.5  1.6  1.5  1.2    1.700  
0.4  0.4  0.4  0.4    0.400'''

df = pd.read_table(io.BytesIO(content), sep='\s+')
df.to_csv('/tmp/test.csv', float_format='%g', index=False)

产量

1,2,3,4,mean
,,,,
5.9,5.4,2.4,3.2,4.225
0.6,0.7,0.7,0.7,0.675
2.5,1.6,1.5,1.2,1.7
0.4,0.4,0.4,0.4,0.4

【讨论】:

  • 什么是'%g',是来自here的表示类型吗?
  • @AndyHayden:基本上,是的。但由于它使用百分号,我认为 float_format 使用的是旧式字符串格式documented here
【解决方案2】:

答案似乎是正确的。浮点数无法在我们的系统上完美表示。难免有些不同。阅读The Floating Point Guide

>>> a = 5.9+5.4+2.4+3.2
>>> a / 4
4.2250000000000005

如您所说,如果您只想获得小数点后的固定点数,则始终可以格式化结果。

>>> "{:.3f}".format(a/4)
'4.225'

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2018-10-03
    相关资源
    最近更新 更多