Python3熊猫数据帧四舍五入。5始终向上

Python3熊猫数据帧四舍五入。5始终向上,python,pandas,rounding,Python,Pandas,Rounding,根据,如果上下舍入值同样接近原始值,Python将值舍入为偶数 我想对我的pandas.DataFrame中的值进行四舍五入,以便0.5始终向上取整 解决此问题的一种方法是将decimal模块与decimal数据类型一起使用,如下所述: 哪些产出: 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.50000

根据,如果上下舍入值同样接近原始值,Python将值舍入为偶数

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

解决此问题的一种方法是将
decimal
模块与
decimal
数据类型一起使用,如下所述:

哪些产出:

       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
总是四舍五入

编辑

我不确定评论中的链接是否回答了这个问题。
链接中提供的解决方案是将每个浮点值强制转换为字符串,并对字符串进行操作,这对于大型数据帧来说似乎很荒谬。(而且很难阅读/理解)。我希望在
decimal
包中有一个简单的函数可以使用,比如当十进制为
0.5
时,您可以向
orig
添加一些微小的值。这保证了任何整数+0.5将始终向上取整到下一个整数

将numpy导入为np
df['round_up']=np.round(np.where(df['orig']%1==0.5,
df['orig']+0.1,
df['orig']))
打印(df)
原始汇总
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

使用
十进制
模块,您可以

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

看起来可能是重复的,一个mod可以结束这个问题吗。你能举一些例子来说明这是如何解决我的数据帧取整问题的。5我喜欢你关于“`%`操作符的想法。我最终使用了一种受你答案启发的方法,那就是:
df[“round”]=np.floor(df[“orig”])
,然后是
df.loc[df[“orig”]%1>=0.5,“round”]+=1
甚至更好:
df[“group”]=np.where(df[“orig”]%1<0.5,np.floor(df[“orig”]),np.ceil(df[“orig”]))
太棒了!是的,最后一个很好。您还可以尝试
df['orig']-np.floor(df['orig'])
来隔离小数点。虽然这只是一个猜测,但我有一种预感,
%
可能比
-
慢。
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)
)