直接控制to_csv(float_format)可避免CSV科学计数法——float_format仅作用于数值列,强制格式化浮点数输出;display.float_format只影响显示,不影响文件序列化。

直接控制 float_format 参数或预设 pd.options.display.float_format,就能避免 Pandas 写入 CSV 时自动转成科学计数法——不是数据变了,是显示格式没锁住。
用 to_csv(float_format) 强制指定小数位数
这是最干净、作用域最明确的方式。只要你在调用 to_csv() 时传入 float_format,Pandas 就会在写入前对所有浮点数统一格式化,不依赖全局设置,也不影响其他操作。
-
float_format='%.6f':保留 6 位小数,末尾零不省略(如12.300000) -
float_format='%.2f':适合金额类字段,但注意会四舍五入(12.345→12.35) - 别用
float_format='%.0f'处理含小数的列,否则会丢精度(12.9→13) - 如果某些列是整数但被识别为
float64(比如含 NaN),先用df[col] = df[col].astype('Int64')转成可空整型,再写入,比硬套float_format更稳妥
为什么 pd.set_option('display.float_format', ...) 不起作用?
因为 pd.set_option('display.float_format', ...) 只影响 print(df) 或 Jupyter 输出,和 to_csv() 完全无关。很多人试了这个发现 CSV 还是科学计数,就是混淆了「显示」和「序列化」两个阶段。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
display.float_format是给终端看的,不是给文件写的 -
to_csv()默认用 Python 原生str()转浮点,而str(0.000123)就是'1.23e-04' - 除非你手动重写
to_csv的底层 formatter(不推荐),否则必须显式传float_format
遇到混合类型列(比如数字+空字符串)导致格式失效?
当某列里既有数字又有非数字(如空字符串 ''、'N/A'),Pandas 会把它设为 object 类型,此时 float_format 完全不生效——它只对数值型列(float64, int64 等)起作用。
- 先检查列类型:
print(df['col'].dtype),如果是object,就得清洗 - 用
pd.to_numeric(df['col'], errors='coerce')把非法值转为 NaN,再处理缺失 - 清洗后若仍需保留原始字符串(如 ID 列含前导零),就别用
float_format,改用df['col'] = df['col'].astype(str)预转字符串,再写入 - CSV 本身没有类型,所谓“不科学计数”本质是让数字以纯十进制字符串形式落地,所以预转
str是兜底手段
真正容易被忽略的是:科学计数法问题往往不是出在写入那一刻,而是源头数据类型已经混杂,或者误以为 display 设置能影响文件输出。盯住 dtype 和 float_format 这两个点,比调各种 option 有效得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










