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.0numpy 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_csvfloat_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的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Pandas 查询中删除 float64

如何更改熊猫中多列的数据类型

针对 float64 与 object 和 int64 列对具有不同条件的时间序列进行上采样

如何将日期和小时列合并到熊猫系列中的一个索引列中?

将 float64 数据类型与 scikit-learn ML 算法一起使用是不是合适?

pandas 比较引发 TypeError:无法将 dtyped [float64] 数组与 [bool] 类型的标量进行比较