【问题标题】:round() function behaves differently in apply() functionround() 函数在 apply() 函数中的行为不同
【发布时间】:2019-01-17 06:12:10
【问题描述】:

我从数据框中抓取了一行,如下所示:

https://i.stack.imgur.com/Y9LUE.png

Clicks  Spend   clk_ar  CPC     AdRank  temp    tempRan
36.0    248.76  59.94   6.91    1.67    1.665   1.67

我需要在 temp 列中用 2 位数字舍入值

选项 1:

round(df.temp,2)

OUTPUT:
1676725    1.66
Name: temp, dtype: float64

选项 2:

df.temp.apply(lambda x:round(x,2))

OUTPUT:
1676725    1.67
Name: temp, dtype: float64

两个轮函数表现出不同的行为。显然选项 1 与 python 3 行为一致。见Python 3.x rounding behavior

我只是想知道为什么选项 2 会这样。感谢您的帮助!

【问题讨论】:

  • 另见here
  • 让我有点吃惊的是,使用 dtype np.float64 从 Pandas Series 中提取值会得到实际的 Python float 对象,而不是 NumPy float64 对象。 (即使在 Python 的内置 round 函数下,这两个在 Python 3 上也有所不同。)
  • 除非您通过索引直接提取值,否则您确实会得到np.float64 实例而不是float 实例。只有在apply 下,您才能神秘地获得常规的floats。啊!

标签: python-3.x pandas dataframe lambda rounding


【解决方案1】:

我认为原因就在这里numpy docs

注意事项

对于恰好介于四舍五入的十进制值之间的值,NumPy 四舍五入到最接近的偶数值。因此 1.5 和 2.5 舍入为 2.0, -0.5 和 0.5 舍入到 0.0 等。结果也可能令人惊讶,因为 IEEE 浮点中小数的不精确表示 标准 [1] 和按 10 次方缩放时引入的错误。

在选项 1 中,您正在舍入使用 about 规则的 numpy.float。

在选项 2 中,您将舍入 python 浮点数据类型 docs here

浮点运算的乐趣:

round(1.675, 2)  
1.68

round(2.675, 2) 
2.67

【讨论】:

  • 比这更微妙。事实上,Python 的round 在所有情况下都遵循最接近偶数规则,而 NumPy 则没有。但由于二进制浮点通常所见即所得的性质,实际四舍五入的值根本不是中途情况。在典型的机器上,被四舍五入的实际值为1.66500000000000003552713678800500929355621337890625,应该四舍五入。
  • @MarkDickinson 感谢您提供这些信息和洞察力。
  • 是的,对不起;我不必要地吹毛求疵;不同之处在于,正如您所说,我们将 NumPy float64 实例与常规 Python floats 进行舍入,尽管为什么我们从 @987654329 中获得常规 Python floats 有点神秘@ 与 dtype np.float64.
  • @MarkDickinson 无需道歉,我重视这些见解。再次感谢。
猜你喜欢
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多