Pandas保留小数:round(2)后需避免值近似为1.00的问题
解决Python Pandas中保留两位小数时强制将接近1的数转为0.99的问题
针对你遇到的问题——含6位小数的浮点值保留两位小数时,接近1的数(如0.998344)调用round(2)得到1.0,但需要输出0.99且必须为两位小数,以下是两种可行的解决方案:
方法1:使用向下取整实现强制截断到0.99
利用numpy.floor函数,将数值放大100倍后取不大于它的最大整数,再缩小回原比例,直接得到两位小数的截断结果,正好符合需求:
import pandas as pd import numpy as np ones_list = [0.998344, 0.996176, 0.998344, 0.998082] df = pd.DataFrame(ones_list, columns=['value_to_round']) # 计算截断到两位小数的结果 df['rounded_value'] = np.floor(df['value_to_round'] * 100) / 100 # 强制格式化为两位小数,确保输出为0.99而非其他格式 df['rounded_value'] = df['rounded_value'].apply(lambda x: f"{x:.2f}") print(df['rounded_value'])
输出结果:
0 0.99 1 0.99 2 0.99 3 0.99 Name: rounded_value, dtype: object
方法2:先四舍五入再替换目标值
先正常调用round(2),再将结果中等于1.0的数值替换为0.99,最后格式化两位小数:
import pandas as pd ones_list = [0.998344, 0.996176, 0.998344, 0.998082] df = pd.DataFrame(ones_list, columns=['value_to_round']) # 先四舍五入,再替换1.0为0.99,最后格式化 df['rounded_value'] = df['value_to_round'].round(2).replace(1.0, 0.99).apply(lambda x: f"{x:.2f}") print(df['rounded_value'])
输出结果与方法1一致。
两种方法的区别:
- 方法1会对所有数值做两位小数的向下取整,比如0.994999会得到0.99;
- 方法2仅修正四舍五入后等于1.0的数值,其他数值正常保留四舍五入结果。
内容的提问来源于stack exchange,提问作者Aleksei Belkin
相关产品推荐
相关产品推荐

