Python 中Pandas如何格式化浮点数 利用style设置数值显示精度|Duuu笔记
df.style.format() 不影响原始数据,因其仅为显示层机制,只改变HTML/Notebook渲染外观,底层数值类型、精度、存储均不变;取值如df.iloc[0,0]仍返回原始浮点数(如3.1415926535),导出CSV/Excel默认用原始值,需额外参数或round()修改数据本身。
为什么
df.style.format()
不影响原始数据
因为
style
是纯显示层机制,只改变渲染后的 HTML 或 Notebook 中的外观,底层
df
的数值类型、精度、存储完全不变。你用
df.iloc[0, 0]
取出来的还是原始浮点数,比如
3.1415926535
,不会变成
3.14
。
常见错误现象:改完
format()
后导出 Excel 或做计算,发现小数位没“生效”——那是正常现象,不是 bug。
导出 CSV/Excel 时默认用原始值,需额外传参如
df.to_excel(..., float_format="%.2f")
想永久截断数值,得用
round()
或
np.round()
修改数据本身
format()
中的字符串模板(如
"{:.2f}"
)不支持条件逻辑,复杂格式要写自定义函数
按列单独控制精度比全局 format() 更常用
实际分析中,价格列保留 2 位,增长率保留 1 位,误差值保留 6 位很常见。硬套全局
format("{:.3f}")
反而掩盖信息。
推荐直接传字典:
“
Python免费学习笔记(深入)
”;
df.style.format({
"price": "${:.2f}",
"growth_rate": "{:.1%}",
"error": "{:.6f}"
})
注意:
format()
键名必须严格匹配列名(区分大小写),且只对
object
和数值列生效;如果某列是
category
或含空值,可能静默失效。
列名带空格或特殊字符?用
df.columns = df.columns.str.replace(" ", "_")
预处理更省心
想对所有数值列统一设精度,用
{np.number: "{:.2f}"}
,但会覆盖已定义的字符串列格式
百分比列别忘了先乘 100 再用
{:.1%}
,否则 0.05 会显示成 5.0%
导出 HTML 时样式丢失?检查
set_properties()
和
to_html()
的配合
style.format()
生成的是
Styler
对象,直接调
to_html()
才能保留格式;如果误用
df.to_html()
,就只剩原始数据。
白瓜AI
白瓜AI,一个免费图文AI创作工具,支持 AI 仿写,图文生成,敏感词检测,图片去水印等等。
下载
正确写法:
df.style.format({"value": "{:.3f}"}).to_html("report.html")
容易踩的坑:
在 Jupyter 里显示正常,但保存 HTML 后打开发现没格式?大概率漏了
.to_html()
,用了
df.to_html()
导出的 HTML 没表格边框?加
.set_properties(**{"border": "1px solid #ddd"})
中文列名乱码?确保
to_html()
加
escape=False
并用 UTF-8 编码保存文件
性能敏感场景下慎用
format()
+ 大量行数
Styler
在渲染时会对每单元格调用格式化函数,10 万行 × 10 列就是百万次字符串操作。Jupyter 渲染会明显卡顿,导出 HTML 文件体积也暴涨。
替代思路:
仅对前 1000 行用
style
,其余用
df.head(1000).style...
真要导出全量带格式的 HTML?先用
round()
降精度再导出,避免运行时格式化
服务端生成报表?考虑用
plotly.express
或
dash
动态格式化,而非 Pandas Styler
最常被忽略的一点:
format()
不支持 NaN 的差异化显示,比如想把缺失值标为
"—"
而非空字符串,得用
df.fillna("—").style.format(...)
,但要注意这会改变原始
NaN
类型,后续
isna()
判断会失效。
