
本文介绍如何在 Pandas 的 to_string() 中通过自定义格式化函数,实现多列分别左对齐并指定起始列位置(如第3列、第10列),解决数值字符串输出错位问题。
本文介绍如何在 pandes 的 `to_string()` 中通过自定义格式化函数,实现多列分别左对齐并指定起始列位置(如第3列、第10列),解决数值字符串输出错位问题。
在使用 df.to_string(index=False, header=False) 生成纯文本表格时,Pandas 默认按列内最大宽度自动右对齐(数值型)或左对齐(字符串型),但无法直接指定某列从第 N 个字符开始显示——因为 to_string 输出的是已排版的字符串,而非可编辑的字符网格。不过,我们可以通过 formatters 参数为每列单独设置 Python 格式化规则,间接实现“视觉上对齐到指定列位置”的效果。
关键思路是:用 f-string 的宽度占位(如 f"{x:)统一扩展每列内容长度,使前导空格可控。例如,若希望第1列左对齐于第3列(即整体左缩进2空格)、第2列左对齐于第10列(即第1列占7字符宽 + 前导空格2 = 第10列起始),则第1列应设最小宽度为7,第2列设为7(或根据实际数据动态计算)。
以下为完整实现:
import pandas as pd
data = [[2025, 198237, 77, 18175],
[202, 292827, 77, 292827]]
df = pd.DataFrame(data).iloc[:, [0, 3]] # 只保留第1列和第4列
# 动态计算各列所需最小宽度(推荐)
col_widths = [len(str(df.iloc[:, i].max())) for i in range(df.shape[1])]
# 或统一指定宽度(如第1列宽7、第2列宽8)
widths = [7, 8]
# 定义通用左对齐格式化器
def left_align(width):
return lambda x: f"{x:<{width}}"
# 应用到对应列
formatters = [left_align(widths[0]), left_align(widths[1])]
result = df.to_string(
index=False,
header=False,
formatters=formatters,
justify='left' # 确保列间无额外居中偏移
)
print(result)输出:
2025 18175 202 292827
⚠️ 注意事项:
formatters是按列顺序传入的列表,长度必须与 DataFrame 列数一致;f"{x: 中的 <code>7指总宽度(含数字本身),不足部分补空格;若数字本身超长(如12345678),会自动扩展,不截断;- 若需严格“第1列从第3字符开始、第2列从第10字符开始”,需确保第1列宽度 = 10 − 3 = 7,且两列之间无分隔符(默认空格分隔符不可禁用,但可通过
sep=''配合自定义格式器规避——此时建议改用df.astype(str).apply(...)拼接);- 对于更复杂对齐需求(如混合对齐、固定列偏移),推荐先用
df.astype(str)转为字符串,再逐行构造格式化字符串,灵活性更高。
总结:to_string(formatters=...) 是 Pandas 中最简洁可控的文本对齐方案。通过结合动态宽度计算与 f-string 格式化,既能保持代码可读性,又能精准满足终端/日志等场景下的排版要求。

















