pandas python - round()表现不正常

时间:2015-07-03 12:06:21

标签: python dataframe rounding

我将数据框中的值四舍五入到小数点后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

上面的代码错误地围绕' 3.95'在专栏' Varen 2015'到3.9而不是4.0。

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

round(3.95,1)

输出

4.0

仅供参考 - 我正在使用python版本2.7.9

2 个答案:

答案 0 :(得分: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

我怀疑显示器误导了你。

答案 1 :(得分:1)

您提到您正在使用pandas数据帧。我无法重现您所看到的行为:

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的好处是将一个操作应用于整个系列的项目。