当前位置: 首页 > 知识库问答 >
问题:

与熊猫一起漂流

吴嘉禧
2023-03-14

我正在读一个带有如下浮点数的CSV:

Bob,0.085
Alice,0.005

并导入到数据框中,然后将此数据框写入新位置

df = pd.read_csv(orig)
df.to_csv(pandasfile)

现在,此pandas文件具有:

Bob,0.085000000000000006
Alice,0.0050000000000000001

发生了什么事?也许我得换种类型比如Float32什么的?

我用熊猫0.9。0和numpy 1.6。2.


共有2个答案

吴镜
2023-03-14
匿名用户

更新:在撰写本文时,答案是准确的,浮点精度仍然不是默认情况下使用to_csv/read_csv(精度性能折衷;默认值有利于性能)得到的。

现在,熊猫可以使用float_format参数。DataFrame.to_csv和float_precision参数可用于pandas.from_csv

原文仍然值得一读,以便更好地理解这个问题。

这是熊猫中的一个bug,不仅在“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文件,您将获得这些整数。然后将这些值转换为浮点值,除以之前乘以的相同因子。

西门良才
2023-03-14

正如评论中提到的,这是一个一般的浮点问题。

但是,您可以使用to_csvfloat_格式关键字将其隐藏:

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的说明,请参阅格式规范迷你语言。

 类似资料:
  • 我试图使用beautiful soup刮一个html表,并将其导入熊猫--http://www.baseball-reference.com/teams/nym/2017.shtml--“Team Batting”表。 找表没问题: 现在我很难把所有的东西放在一个数据帧中。以下是我目前掌握的信息: 这一次只适用于一行。我的问题是如何同时对表中的每一行都这样做?

  • 问题内容: 我正在尝试对数据框进行列绑定并遇到pandas的问题,因为它似乎不起作用: 结果是 即使我使用重置索引 然后尝试 它仍然产生相同的结果! 问题答案: 如果我正确理解您的意思,这就是您想要做的。 这使: 实际上,我期望得到相同的结果。 这是 jreback 的出色解释: “忽略”,表示未在连接轴上对齐。它只是按照传递的顺序将它们粘贴在一起,然后为实际索引(例如)重新分配一个范围,因此联接

  • 问题内容: 我在终端上经常使用和。系列的默认值返回精简的样本,具有一些头和尾值,但其余部分丢失。 有没有一种内置方法可以漂亮地打印整个?理想情况下,它将支持适当的对齐方式,可能会支持列之间的边界,甚至可能会为不同的列进行颜色编 问题答案: 你也可以将,与一个或多个选项一起使用: 这将使选项自动返回其先前的值。 如果你正在使用,则使用代替将使用丰富的显示逻辑(像这样)。

  • 问题内容: 我有一个4个熊猫数据框的列表,其中包含我想合并为一个数据框的一天的报价数据。我无法理解concat在时间戳上的行为。请参阅以下详细信息: 使用我得到: 使用我得到: 注意使用时索引如何变化。为什么会发生这种情况,我将如何使用该方法来重现使用所获得的结果?(因为看上去快得多;每个循环24.6 ms,而每个循环3.02 s) 问题答案: 因此,您正在执行的操作是append和concat

  • 问题内容: 我有一个看起来像这样的DataFrame: 我想将其转换为对属于某些bin的视图进行计数,如下所示: 我试过了: 但它仅提供汇总计数,而不提供用户计数。如何获得用户的垃圾箱计数? 总计计数(使用我的真实数据)如下所示: 问题答案: 您可以按垃圾箱 和 用户名分组,计算分组大小,然后使用:

  • 问题内容: 我正在尝试从熊猫数据框中删除NA值。 我用过(它应该从数据帧中删除所有NA行)。但是,它不起作用。 这是代码: 这就是获取数据帧的方式。如下所示,默认方法确实将NA数据点转换为。 方便地,DF的已经包含一个NaN值(在列中),因此打印此代码,您将得到: 但是,运行不会以任何方式更改数据框。 问题答案: 默认情况下,返回没有值的新数据集。因此,您必须将其分配给变量 如果要修改它,就必须明