保存Pandas DataFrame至CSV时数值出现偏移问题求助
问题:DataFrame四舍五入后保存CSV出现微小数值偏移
最小复现示例
import pandas as pd # 注:原代码需先将字典转为DataFrame,否则无法调用round方法 df = pd.DataFrame({ "value1": [110.589, 222.534, 390.123], "value2": [50.111, 40.086, 45.334] }) df.round(1) # checkpoint:调试时看到四舍五入后数值为 [110.6000, 222.5000, 390.1000] 等 df.to_csv("output.csv")
现象
调试时四舍五入后的数值显示为预期的一位小数形式,但保存为CSV后,部分数值出现微小偏移,比如110.6变成110.600000000001,222.5变成222.499999999999等,偏移量固定为±0.000000000001。
原因
这是二进制浮点数的精度局限性导致的:
- 很多十进制小数(比如0.1)无法用二进制浮点数精确存储,只能以近似值的形式存在于内存中。
- 调试工具显示的四舍五入数值是格式化后的结果(仅展示4位小数),但内存中实际存储的是接近目标值的二进制近似值。
- 保存CSV时,pandas默认会输出足够多的小数位来还原这个内存中的近似值,于是出现肉眼可见的微小偏移。
- 额外注意:原代码中
df.round(1)未重新赋值给df,这会导致原DataFrame并未被修改——如果你的实际代码也是如此,调试看到的数值只是临时返回结果,原数据还是未四舍五入的浮点数,会加剧精度问题。
解决方法
1. 保存CSV时强制指定小数位数(最简便)
使用to_csv的float_format参数,直接控制输出的小数位数,避免显示精度问题:
# 先正确赋值四舍五入后的结果 df = df.round(1) # 保存时指定保留1位小数 df.to_csv("output.csv", float_format="%.1f")
2. 转换为Decimal类型存储(彻底解决浮点数精度问题)
如果需要严格的十进制精度,可以使用decimal模块将数值转为Decimal类型后再保存:
from decimal import Decimal, ROUND_HALF_UP # 定义四舍五入函数 def round_decimal(x): return Decimal(str(x)).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP) # 对DataFrame的数值列应用转换 df = df.applymap(round_decimal) # 保存CSV df.to_csv("output.csv")
3. 确保四舍五入操作生效
务必将round的结果重新赋值给原DataFrame,否则原数据不会被修改:
# 错误写法:仅调用round但不赋值,原df不变 # df.round(1) # 正确写法:赋值覆盖原DataFrame df = df.round(1)
内容的提问来源于stack exchange,提问作者starsnpixel
相关产品推荐
相关产品推荐

