pandas.set_option('display.float_format', '{:.2f}'.format)仅控制交互式显示格式,不改变数据类型或底层值,对to_csv、values等操作无效,导出需显式格式化。

为什么 pandas.set_option 不能真正“转换”科学计数法
它只是控制显示格式,不改变数据本身的类型或值。你看到的 1.23e+04 变成 12300.0,只是打印/输出时的字符串渲染方式变了,df.iloc[0, 0] 拿到的还是原始 float64 值,底层存储没变。
常见错误现象:设置了 pd.set_option('display.float_format', '{:.2f}'.format) 后,用 print(df) 看着正常了,但导出 CSV 或做数值计算时又冒出科学计数法——因为导出和计算走的是原始值路径,不经过 display 配置。
-
display.float_format只影响print(df)、Jupyter 输出、df.head()这类交互式展示 - 对
df.to_csv()、df.values、list(df['col'])完全无效 - 若需导出为普通数字,必须显式格式化或转字符串,不能依赖 set_option
正确设置全局浮点显示:用 display.float_format 而非 display.format
display.format 是旧版(pandas display.float_format。设错会导致静默失效——看着没报错,但科学计数法照常出现。
实操建议:
- 用函数式赋值,例如:
pd.set_option('display.float_format', '{:.6f}'.format),避免传字符串如'{:.6f}'(会报错) - 若要保留自适应小数位(如整数不带小数点),可用 lambda:
pd.set_option('display.float_format', lambda x: f'{x:.6g}') - 重置回默认:执行
pd.reset_option('display.float_format'),别手动删字典键
导出 CSV 时仍出现科学计数法?必须干预 to_csv 参数
set_option 对 to_csv 零作用。CSV 导出直接序列化原始数值,不查 display 配置。
解决方案只有两个:
- 在导出前对列做
round()或map('{:.8f}'.format)强制转字符串(注意:这会让该列变成 object 类型) - 用
to_csv(float_format='%.6f')参数——这是唯一能影响导出格式的开关,float_format是to_csv的专属参数,和set_option无关 - 警惕
np.float64('1e-5')这类极小值:即使设了float_format='%.10f',也可能因精度溢出变0.0000000000,此时应改用%.10g保持有效数字
性能与兼容性提醒:别在生产脚本里滥用 set_option
全局配置会影响后续所有 pandas 输出,包括你没预料到的第三方库日志(比如某些 ML 库内部调用 df.info())。Jupyter notebook 里临时调试没问题,但打包成 CLI 工具或服务时容易引发意外格式污染。
更稳妥的做法:
- 用上下文管理器临时生效:
with pd.option_context('display.float_format', '{:.4f}'.format): print(df) - 对单个 Series/DataFrame 用
df.style.format({'col': '{:.4f}'})(仅限 Jupyter 渲染) - 彻底规避显示问题:用
df.astype(str)+ 正则替换科学计数法字符串(适合导出前清洗)
最易被忽略的一点:set_option 不跨进程、不跨线程、不进 pickle。如果你用 multiprocessing 或保存了 df 到文件再读取,display 配置就消失了——它纯属当前 Python 解释器会话的 UI 设置。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











