Python3熊猫数据帧四舍五入。5始终向上
根据,如果上下舍入值同样接近原始值,Python将值舍入为偶数 我想对我的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
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)
)