Pandas处理CSV时8.1e-202精度异常,其他浮点值正常的原因及修正
浮点数精度导致Pandas读写CSV时数值异常的问题及格式保留需求
我在使用Pandas读取CSV生成DataFrame、计算后再导出到新CSV的过程中,发现一个奇怪的现象:数值8.1e-202被自动修改为8.1000000000000005e-202,但其他类似的科学计数法数值都能正常保留。
示例复现
示例文件example.csv内容:
id,e-value ID1,1e-20 ID2,8.1e-202 ID3,9.24e-203
执行代码:
import pandas as pd df = pd.read_csv("example.csv") df.iloc[1]["e-value"] >>> 8.1000000000000005e-202 df.iloc[2]["e-value"] >>> 9.24e-203
为什么只有8.1e-202出现这种“篡改”,而9.24e-203却能正常显示?
尝试的解决方案(无效)
- 查看默认数据类型:
df["e-value"].dtype >>> dtype('float64')
- 尝试改用numpy的
longdouble类型读取:
import numpy as np df = pd.read_csv("./temp/test", dtype={"e-value" : np.longdouble})
结果依然异常:
df.iloc[1]["e-value"] >>> 8.100000000000000522e-202
我测试了大于或小于8.1e-202的多个数值,都没有出现这个问题,求解释原因?
编辑补充:
我明白浮点数本身存在精度缺陷,但现在的核心需求是:将DataFrame写回CSV后,第二行要显示为ID2,8.1e-202,而不是带多余小数位的数值。我尝试过格式化列的方法,但这个方案会把原本正常的其他浮点数也强制转为科学计数法,不符合预期:
def format_eval(e): return "{0:.1e}".format(e) df["e-value"] = df["e-value"].apply(lambda x: format_eval(x))
内容的提问来源于stack exchange,提问作者langness
相关产品推荐
相关产品推荐

