You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas的to_string输出中自动换行长列名?

Pandas实现长列名自动换行并对齐值的解决方案

问题描述

将DataFrame列名替换为长文本后,使用to_string()输出时仅最后一列的列名和对应值会换行。期望实现每个长列名在约20字符处自动换行,且对应的数据值能对齐显示。尝试设置max_colwidth=20及手动添加换行符均无效,需可行实现方案。

原示例代码:

import pandas as pd

df = pd.DataFrame({
  "LIDSA": [0, 1, 2, 3],
  "CAE": [3, 5, 7, 9],
  "FILA": [1, 2, 3, 4], # 2 is default, so table idx 1 is default
  "VUAMA": [0.5, 1.0, 1.5, 2.0],
})
df_colnames = {
  "LIDSA": "Lorem ipsum dolor sit amet",
  "CAE": "Consectetur adipiscing elit",
  "FILA": "Fusce imperdiet libero arcu",
  "VUAMA": "Vitae ultricies augue molestie ac",
}

with pd.option_context('display.max_rows', None, 'display.max_columns', None, 'display.width', 0, 'max_colwidth', 20, 'display.float_format', "{:.2f}".format):
  df_str = df.rename(df_colnames,axis=1).to_string()

print(df_str)

期望输出:

Lorem ipsum dolor      Consectetur  Fusce imperdiet    Vitae ultricies
            sit amet  adipiscing elit      libero arcu  augue molestie ac
0                  0                3                1               0.50
1                  1                5                2               1.00
2                  2                7                3               1.50
3                  3                9                4               2.00

解决方案

Pandas原生to_string()不支持列名拆分行并自动对齐数据的功能,需手动处理列名换行与表格对齐,实现步骤如下:

  1. 拆分长列名为两行,优先按空格拆分避免截断单词,确保每行适配列宽
  2. 从原生格式化结果中提取列宽,保证列名与数据对齐
  3. 构建拆分后的两行表头,再与数据行合并输出

实现代码:

import pandas as pd

df = pd.DataFrame({
    "LIDSA": [0, 1, 2, 3],
    "CAE": [3, 5, 7, 9],
    "FILA": [1, 2, 3, 4],
    "VUAMA": [0.5, 1.0, 1.5, 2.0],
})
df_colnames = {
    "LIDSA": "Lorem ipsum dolor sit amet",
    "CAE": "Consectetur adipiscing elit",
    "FILA": "Fusce imperdiet libero arcu",
    "VUAMA": "Vitae ultricies augue molestie ac",
}

# 先获取原生格式化的数据和表头
with pd.option_context('display.max_rows', None, 'display.max_columns', None, 
                       'display.width', 0, 'display.float_format', "{:.2f}".format):
    formatted_df = df.rename(df_colnames, axis=1).to_string(index=True)

lines = formatted_df.split('\n')
header_line = lines[0]
data_lines = lines[1:]

# 计算每列的宽度
col_widths = []
current_pos = 0
cols = list(df_colnames.values())
for i in range(len(cols)):
    if i == len(cols)-1:
        width = len(header_line) - current_pos
    else:
        next_pos = header_line.find(cols[i+1], current_pos)
        width = next_pos - current_pos
    col_widths.append(width)
    current_pos = next_pos

# 拆分每个列名为两行
split_headers = []
for name, width in zip(cols, col_widths):
    split_idx = 20
    # 优先在空格处拆分,避免截断单词
    if len(name) > 20:
        while split_idx > 0 and name[split_idx] != ' ':
            split_idx -= 1
        if split_idx == 0:
            split_idx = 20
    line1 = name[:split_idx].strip()
    line2 = name[split_idx:].strip()
    # 右对齐到列宽
    split_headers.append((line1.rjust(width), line2.rjust(width)))

# 拼接表头和数据
header_line1 = ''.join(h[0] for h in split_headers)
header_line2 = ''.join(h[1] for h in split_headers)
final_output = '\n'.join([header_line1, header_line2] + data_lines)

print(final_output)

代码说明

  • 列宽提取:从原生表头行中自动计算每列宽度,确保后续对齐一致性
  • 智能拆分:优先在空格处拆分长列名,兼顾换行位置与可读性
  • 对齐处理:用rjust()将拆分后的列名右对齐到列宽,保证数据与列名完美对齐

内容的提问来源于stack exchange,提问作者sdbbs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:25:10