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

如何调整Pandas DataFrame打印时多级索引列的对齐方式以实现紧凑显示

如何调整Pandas DataFrame打印时多级索引列的对齐方式以实现紧凑显示

我完全懂你说的这个痛点——Pandas默认的多级列索引打印逻辑确实有点反直觉,上层索引硬要和最左列对齐,导致列头部分松松散散的,特别浪费空间。想要实现你说的那种紧凑对齐(上层索引和对应的子列组顶部对齐),目前Pandas原生还没有直接的参数支持(正如@mozway提到的,这已经是一个功能请求了),不过我们可以用几种变通方法来搞定:

方法一:用第三方库tabulate快速实现(简单省心)

如果你不介意安装一个轻量的第三方库,tabulate对多级索引的打印支持非常友好,默认就能输出紧凑对齐的格式。

首先安装库(如果还没装的话):

pip install tabulate

然后用下面的代码打印DataFrame:

import numpy as np
import pandas as pd
from tabulate import tabulate

df = pd.DataFrame(
    [np.arange(6), np.arange(6)+5],
    columns=pd.MultiIndex.from_product([("a"*10, "b"*20), ("A", "B", "C")])
)

# 用tabulate打印,指定headers='keys'来保留多级列索引
print(tabulate(df, headers='keys', tablefmt='simple'))

这样输出的格式就是你想要的紧凑版:

aaaaaaaaaa       bbbbbbbbbbbbbbbbbbbb
  A    B    C    A    B    C
---  ---  ---  ---  ---  ---
  0    1    2    3    4    5
  5    6    7    8    9   10

方法二:自定义打印函数(纯Pandas原生,无需额外库)

如果不想依赖第三方库,我们可以自己写一个简单的打印函数,手动构建紧凑的列头再打印数据:

import numpy as np
import pandas as pd

def print_compact_multiindex(df):
    if not isinstance(df.columns, pd.MultiIndex):
        print(df)
        return
    
    # 提取多级列索引的层级
    level0 = df.columns.get_level_values(0)
    level1 = df.columns.get_level_values(1)
    # 获取去重的上层索引及其对应的子列数量
    unique_levels = []
    current_l0 = None
    for l0 in level0:
        if l0 != current_l0:
            count = sum(level0 == l0)
            unique_levels.append((l0, count))
            current_l0 = l0
    
    # 构建紧凑的表头两行
    header1 = ""
    header2 = ""
    for l0, cnt in unique_levels:
        # 计算每个上层索引需要占的宽度(按子列数*4估算,可根据实际调整)
        col_width = cnt * 4
        header1 += f"{l0:<{col_width}}"
        # 拼接对应的子列名
        start_idx = sum(c for _,c in unique_levels[:unique_levels.index((l0,cnt))])
        end_idx = start_idx + cnt
        header2 += " ".join(level1[start_idx:end_idx]) + " "
    
    # 打印表头和数据
    print(header1.rstrip())
    print(header2.rstrip())
    print(df.to_string(header=False))

# 测试调用
df = pd.DataFrame(
    [np.arange(6), np.arange(6)+5],
    columns=pd.MultiIndex.from_product([("a"*10, "b"*20), ("A", "B", "C")])
)
print_compact_multiindex(df)

这个函数会输出和你期望一致的紧凑格式,完全用Pandas原生方法实现,不需要额外安装依赖。

补充说明

目前Pandas官方还没有内置这个紧凑对齐的打印选项,正如你提到的,社区已经有人提交了功能请求(RFE),说不定后续版本会支持。不过现在用上面的两种方法,完全可以解决你的需求啦~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 07:54:30