【问题标题】:pandas python - round() not behaving correctlypandas python - round() 行为不正确
【发布时间】:2015-09-21 06:38:12
【问题描述】:

我将数据框中的值四舍五入到小数点后 1 位。

这里是df

                                            Våren 2015  Hösten 2014  Våren 2014
Question                                                                      
1) Maten är vällagad och smakar bra          4.000000     3.469136    3.678571
Δ 2) Maten ser aptitlig ut                   3.883721     3.296296    3.592593
3) Det är en bra variation på grönsakerna    3.365854     2.901235    3.333333
Δ 4) Maten är bra varierad och passar mig    3.725000     3.365854    3.607143
5) Portionsstorleken är lagom                4.166667     3.875000    4.071429
Δ 6) Konsistensen på maten är bra            4.000000     3.468354    3.607143
7) Info om matens innehåll är tydlig         3.950000     3.454545    3.821429
8) Maten levereras i en bra förpackning      3.880952     3.987179    4.214286
9) Jag får den mat jag har beställt          4.166667     4.194805    4.481481

我的代码:

df.applymap(lambda x: round(x,1))

输出

                                            Våren 2015  Hösten 2014  Våren 2014
Question                                                                      
1) Maten är vällagad och smakar bra               4.0          3.5         3.7
Δ 2) Maten ser aptitlig ut                        3.9          3.3         3.6
3) Det är en bra variation på grönsakerna         3.4          2.9         3.3
Δ 4) Maten är bra varierad och passar mig         3.7          3.4         3.6
5) Portionsstorleken är lagom                     4.2          3.9         4.1
Δ 6) Konsistensen på maten är bra                 4.0          3.5         3.6
7) Info om matens innehåll är tydlig              3.9          3.5         3.8
8) Maten levereras i en bra förpackning           3.9          4.0         4.2
9) Jag får den mat jag har beställt               4.2          4.2         4.5

上面的代码错误地将“Varen 2015”列中的“3.95”四舍五入为 3.9 而不是 4.0。

注意:如果我像这样直接将数字插入函数,它会返回正确的值...

round(3.95,1)

输出

4.0

仅供参考 - 我使用的是 python 版本 2.7.9

【问题讨论】:

  • 你能告诉我整个结果吗?对我来说,它在循环中运行良好。
  • 从其他数字中收集,可能 3.95 只是像 3.94999999 这样的数字的表示形式,由 numy/panda 内部字符串表示形式四舍五入。相反,当您手动输入 3.95 时,这可能是一个稍微不同的数字。调高numpy/pandas的打印精度,看看data中的3.95是否还是3.95。
  • @Evert 这可能是一种可能性
  • 虽然我无法重现您的问题,但我设法解决了反问题:3.4999999 舍入为 4.0:data = np.array([1e8/25316455.75]); print(data); print(np.round(data)) \n [ 3.94999999] \n [ 4.]
  • 这只是浮点行为。如果这是四舍五入的结果,您应该继续使用它,或者如果您觉得您的演示文稿失去精度,则将其四舍五入到更多小数。

标签: python dataframe rounding


【解决方案1】:

这有点难以回答,因为您列出的不是 DataFrame,也不是 Python 列表等。

但是,您应该注意,可能没有理由在循环中执行此操作,因为它可以通过矢量(并且正确)完成:

import numpy as np

data = [[ 4., 3.4691358, 3.67857143],
    [ 3.88372093, 3.2962963, 3.59259259],
    [ 3.36585366, 2.90123457, 3.33333333],
    [ 3.725, 3.36585366, 3.60714286],
    [ 4.16666667, 3.875, 4.07142857],
    [ 4., 3.46835443, 3.60714286],
    [ 3.95, 3.45454545, 3.82142857],
    [ 3.88095238, 3.98717949, 4.21428571],
    [ 4.16666667, 4.19480519, 4.48148148]]

>> np.array(data).round(1)
array([[ 4. ,  3.5,  3.7],
   [ 3.9,  3.3,  3.6],
   [ 3.4,  2.9,  3.3],
   [ 3.7,  3.4,  3.6],
   [ 4.2,  3.9,  4.1],
   [ 4. ,  3.5,  3.6],
   [ 4. ,  3.5,  3.8],
   [ 3.9,  4. ,  4.2],
   [ 4.2,  4.2,  4.5]])

编辑在更新您的问题后,我怀疑还有其他问题。许多浮点数实际上不能以有限的小数位数显示。

尝试运行

df['Våren 2015'] < 3.95

df['Våren 2015'] - 3.95

我怀疑显示误导了你。

【讨论】:

  • 我认为复制列表列表会更容易,但你是对的。我已经更新了我的 cmets。
【解决方案2】:

您提到您正在使用熊猫数据框。我无法重现您看到的行为:

In [29]: data
Out[29]:
         c1        c2        c3
0  4.000000  3.469136  3.678571
1  3.883721  3.296296  3.592593
2  3.365854  2.901235  3.333333
3  3.725000  3.365854  3.607143
4  4.166667  3.875000  4.071429
5  4.000000  3.468354  3.607143
6  3.950000  3.454545  3.821429
7  3.880952  3.987179  4.214286
8  4.166667  4.194805  4.481481

In [30]: data.__class__
Out[30]: pandas.core.frame.DataFrame

In [31]: for index, row in data.iterrows():
             for cell in row:
                 print(str(cell) + ': ' + str(round(cell,1)))
   ....:
4.0: 4.0
3.4691358: 3.5
3.67857143: 3.7
3.88372093: 3.9
3.2962963: 3.3
3.59259259: 3.6
3.36585366: 3.4
2.90123457: 2.9
3.33333333: 3.3
3.725: 3.7
3.36585366: 3.4
3.60714286: 3.6
4.16666667: 4.2
3.875: 3.9
4.07142857: 4.1
4.0: 4.0
3.46835443: 3.5
3.60714286: 3.6
3.95: 4.0
3.45454545: 3.5
3.82142857: 3.8
3.88095238: 3.9
3.98717949: 4.0
4.21428571: 4.2
4.16666667: 4.2
4.19480519: 4.2
4.48148148: 4.5

正如 Ami 正确指出的那样,无需遍历矩阵,使用 numpy 的好处是将单个操作应用于整个系列的项目。

【讨论】:

    猜你喜欢
    • 2012-09-09
    • 2014-04-08
    • 2019-08-20
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2021-01-15
    • 2010-09-08
    相关资源
    最近更新 更多