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