繁体   English   中英

Python3 pandas dataframe round.5 始终向上

[英]Python3 pandas dataframe round .5 always up

根据文档,如果上舍入值和下舍入值同样接近原始数字,Python 会将值舍入到偶数选择。

我想对我的pandas.DataFrame中的值进行四舍五入,以使0.5始终向上舍入。

解决它的一种方法是使用具有Decimal数据类型的decimal模块,如下所述: 如何正确舍入 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 来说似乎很荒谬的字符串。 (并且很难阅读/理解)。 我希望有一个简单的 function 可以像decimal package 一样使用

当小数点为0.5时,您可以向orig添加一些微小的值。 这保证了任何 integer + 0.5 将始终向上舍入到下一个 integer。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM