[英]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.