Python3 pandas dataframe round .5 总是向上

Python3 pandas dataframe round .5 always up

根据 documentation,Python 如果上舍入值和下舍入值与原始数字的接近程度相同,则将值舍入为偶数选择。

我想在我的 pandas.DataFrame 中舍入值,这样 0.5 总是向上舍入。

修复它的一种方法是使用具有 Decimal 数据类型的 decimal 模块,如下所述:

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 来说似乎很荒谬。 (而且很难read/understand)。我希望在 decimal

中有一个简单的函数可以使用

当小数点为 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

使用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)
)