float64 与熊猫 to_csv
Posted
技术标签:
【中文标题】float64 与熊猫 to_csv【英文标题】:float64 with pandas to_csv 【发布时间】:2012-10-04 08:07:52 【问题描述】:我正在读取带有如下浮点数的 CSV:
Bob,0.085
Alice,0.005
并导入数据框,并将此数据框写入新位置
df = pd.read_csv(orig)
df.to_csv(pandasfile)
现在这个pandasfile
有:
Bob,0.085000000000000006
Alice,0.0050000000000000001
会发生什么?也许我必须转换为其他类型,例如 float32 或其他类型?
我正在使用 pandas 0.9.0 和 numpy 1.6.2。
【问题讨论】:
欢迎使用浮点数。 重复***.com/questions/1778368/… 我在这里创建了一个问题以更详细地检查:github.com/pydata/pandas/issues/2069 编辑:如果可以,请在 GitHub 问题上独立复制该问题。我无法重现它。 【参考方案1】:更新:答案在撰写本文时是准确的,并且浮点精度仍然不是您使用 to_csv/read_csv 获得的默认值(精度-性能权衡;默认值有利于性能)。
现在有the float_format
argument available for pandas.DataFrame.to_csv
和the float_precision
argument available for pandas.from_csv
。
原版还是值得一读的,以便更好地理解问题。
这是 pandas 中的一个错误,不仅在“to_csv”函数中,而且在“read_csv”中也是如此。这不是一般的浮点问题,尽管 浮点算术 确实是一个需要程序员注意的主题。下面这篇文章澄清了一点这个主题:
http://docs.python.org/2/tutorial/floatingpoint.html
显示“问题”的经典单线是......
>>> 0.1 + 0.1 + 0.1
0.30000000000000004
... 它没有像人们期望的那样显示 0.3。另一方面,如果您使用 定点算术 处理计算,并且仅在最后一步中使用 浮点算术,它将按预期工作。看到这个:
>>> (1 + 1 + 1) * 1.0 / 10
0.3
如果您迫切需要规避这个问题,我建议您创建另一个 CSV 文件,其中包含所有数字为整数,例如乘以 100、1000 或其他方便的因子。在您的应用程序中,像往常一样读取 CSV 文件,您将获得这些整数数字。然后将这些值转换为浮点数,除以之前乘以的相同因子。
【讨论】:
【参考方案2】:如cmets中所说,是一般的浮点问题。
但是你可以使用to_csv
的float_format
关键字来隐藏它:
df.to_csv('pandasfile.csv', float_format='%.3f')
或者,如果您不希望 0.0001 舍入为零:
df.to_csv('pandasfile.csv', float_format='%g')
会给你:
Bob,0.085
Alice,0.005
在您的输出文件中。
有关%g
的解释,请参阅Format Specification Mini-Language。
【讨论】:
我收到错误TypeError: __init__() got an unexpected keyword argument 'float_format'
如果有人出现与@wander95 相同的错误,您可能需要将pandas
更新到较新的版本。以上是关于float64 与熊猫 to_csv的主要内容,如果未能解决你的问题,请参考以下文章
针对 float64 与 object 和 int64 列对具有不同条件的时间序列进行上采样
将 float64 数据类型与 scikit-learn ML 算法一起使用是不是合适?
pandas 比较引发 TypeError:无法将 dtyped [float64] 数组与 [bool] 类型的标量进行比较