
本文介绍如何使用 Pandas 的 Styler.format() 方法,对 DataFrame 中的指定列(如整数列)进行十六进制字符串格式化显示,同时完全保留原始数值类型和数据完整性,避免 apply() 改写原数据或创建副本。
本文介绍如何使用 pandas 的 `styler.format()` 方法,对 dataframe 中的指定列(如整数列)进行十六进制字符串格式化显示,同时完全保留原始数值类型和数据完整性,避免 `apply()` 改写原数据或创建副本。
在数据分析过程中,常需以不同进制(如十六进制)临时展示整数列(例如内存地址、状态码、标志位等),但又必须确保底层数据保持原始 int 类型——以便后续计算、排序、聚合等操作不受影响。Pandas 并未提供类似 display.int_format 的全局整数格式选项,而直接对列赋值(如 df['colB'] = df['colB'].apply(...))会永久改变数据类型与值,违背“仅格式化显示”的初衷。
此时,推荐使用 pandas.io.formats.style.Styler ——这是 Pandas 专为样式化输出设计的轻量级工具,其 format() 方法支持按列指定格式化函数或字符串模板,且所有变换仅作用于渲染阶段,不触碰原始 DataFrame。
以下为完整实现示例:
import pandas as pd
data = [
{"colA": "hello", "colB": 22, "colC": 3.0, "colD": 123476},
{"colA": "there", "colB": 122, "colC": 4.0, "colD": 2384953},
{"colA": "world", "colB": 222, "colC": 5.0, "colD": 39506483},
]
df = pd.DataFrame(data)
# 仅对 'colB' 应用十六进制格式:0x后跟两位大写十六进制数(如 0x16, 0x7A)
styled = df.style.format({"colB": "0x{:02X}"})
# 输出纯文本格式(适合终端/日志打印)
print(styled.to_string(index=True, delimiter="\t"))
输出效果:
colA colB colC colD 0 hello 0x16 3.00 123476 1 there 0x7A 4.00 2384953 2 world 0xDE 5.00 39506483
✅ 关键优势:
- df['colB'].dtype 仍为 int64,所有计算(df.colB.sum()、df.sort_values('colB'))照常工作;
- 无需复制 DataFrame,内存零开销;
- 支持多列差异化格式(如 {"colB": "0x{:02X}", "colD": "{:,}"});
- 兼容 Jupyter Notebook(直接显示富文本表格)、终端(.to_string())及导出(.to_html())。
⚠️ 注意事项:
- Styler 不影响 .values、.to_numpy() 或 .iloc 等底层数据访问;
- 若需导出为 Excel/CSV,应调用 df.to_excel() 原始数据,而非 styled.to_excel()(后者导出的是格式化后的字符串);
- 格式字符串中 {:02X} 表示「至少2位、不足补零、大写」,可根据需要调整(如 {:X} 去零填充,{:04x} 小写四字节)。
综上,Styler.format() 是实现「显示即所见、数据即所存」的理想方案——让格式化真正停留在呈现层,彻底解耦显示逻辑与数据逻辑。










