Python3 pandas dataframe round .5 always up

wkftcu5l  于 2023-09-29  发布在  Python
关注(0)|答案(3)|浏览(107)

根据文档,如果上舍入值和下舍入值同样接近原始数字,则Python将值向偶数选择舍入。
我想对pandas.DataFrame中的值进行四舍五入,使0.5始终向上舍入。
修复它的一种方法是使用Decimal数据类型的decimal模块,如下所述:How to properly round up half float numbers in Python?

import pandas as pd

if __name__ == "__main__":
    df = pd.DataFrame(data=[0.5, 1.499999, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5], columns=["orig"])
    df["round"] = df.round()
    print(df)

其输出:

orig  round
0  0.500000    0.0
1  1.499999    1.0
2  1.500000    2.0
3  2.500000    2.0
4  3.500000    4.0
5  4.500000    4.0
6  5.500000    6.0
7  6.500000    6.0

我试着做了这样的事情:

df["round"] = df["orig"].values.astype(Decimal).round()

但这行不通。是否有一个简单且可读的解决方案来确保.5始终四舍五入?

编辑

我不确定评论中的链接是否回答了这个问题。链接中给出的解决方案是将每个浮点数转换为字符串,并操作字符串,这对于大型 Dataframe 来说似乎是荒谬的。(而且很难读/理解)。我希望有一个简单的函数来使用,就像在decimal包中一样。

s8vozzvw

s8vozzvw1#

当十进制数为0.5时,您可以向orig添加一些微小的值。这保证了任何整数+ 0.5总是向上舍入到下一个整数。

import numpy as np
df['round_up'] = np.round(np.where(df['orig'] % 1 == 0.5,
                                   df['orig'] + 0.1,
                                   df['orig']))
print(df)
       orig  round_up
0  0.500000       1.0
1  1.499999       2.0
2  1.500000       2.0
3  2.500000       3.0
4  3.500000       4.0
5  4.500000       5.0
6  5.500000       6.0
7  6.500000       7.0
uurv41yg

uurv41yg2#

使用decimal模块,您可以

import decimal
df = pd.DataFrame(data=[0.5, 1.499999, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5], columns=["orig"])

df.orig = df.orig.apply(
  lambda x: decimal.Decimal(x).to_integral_value(rounding=decimal.ROUND_HALF_UP)
)
nc1teljy

nc1teljy3#

Pandas的.round()方法将奇数单位值向上舍入,偶数单位值向下舍入。

import pandas as pd

point_5_floats = [x + 0.5 for x in range(11)]
s = pd.Series(point_5_floats)
s.round()
0      0.0
1      2.0
2      2.0
3      4.0
4      4.0
5      6.0
6      6.0
7      8.0
8      8.0
9     10.0
10    10.0
dtype: float64

你可以在所有值上加0.05来解决这个问题。

(s + 0.05).round()
0      1.0
1      2.0
2      3.0
3      4.0
4      5.0
5      6.0
6      7.0
7      8.0
8      9.0
9     10.0
10    11.0
dtype: float64

相关问题