Pandas DataFrame列标题与列内容不对齐问题分析与解决
Pandas打印带ANSI颜色代码的DataFrame列对齐问题及解决
问题现象
用Python字典存储如下嵌套结构的数据:
{'col1': {'row1': '1_1', 'row2': '1_2'}, 'col2': {'row1': '2_1', 'row2': '2_2'}, ... }
列标题均为2字符(如"C1"),行标题最长30字符,行值最长20字符且被shell颜色转义字符串(如\033[95m)包裹,平均长度3字符。将该字典转为DataFrame打印时,出现列标题与列内容严重不对齐的情况:列标题会占据终端整个宽度,而列内容仅按各列数据的最大宽度排布,即使仅显示首尾部分列(如C1 C2 C3 ... C18 C19 C20),二者宽度仍不匹配。
尝试过的无效方案
曾尝试通过pd.set_option('display.max_colwidth', 20)调整列宽,但效果不佳;将值设为10时,列值被截断为单个字符,列标题之间仍存在大量空白。
原因排查与解决方法
移除行值中的颜色字符串后,对齐问题消失。推测Pandas计算列宽度时,错误地将颜色代码计入列标题的宽度计算,但未将其计入列值的宽度计算,属于Pandas的bug。最终通过给列标题添加与颜色代码等长度的空白转义码,使列标题和列值的宽度计算匹配,解决了对齐问题。
复现步骤
- 将以下CSV内容保存为
mock_data.csv - 使用Pandas加载该CSV文件为DataFrame
- 给任意数据值包裹ANSI颜色转义代码
- 打印DataFrame即可复现对齐问题
复现用CSV内容
,0,1,10,11,12,13,14,15,16,17,18,19,2,3,4,5,6,7,8,9 XXXXXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX XXXXXXXXXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX XXXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,"XXX, XXX",XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX XXXXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX XXXXXXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX XXXXXXXXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,"XXX, XXX",XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX X,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,"XXX, XXX",XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX XX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX XXXXXXXX,XXX,XXX,XXX,XXX,XXX,"XXX, XXX",XXX,XXX,XXX,XXX,XXX,"XXX, XXX",XXX,XXX,XXX,XXX,XXX,XXX,"XXX, XXX",XXX XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX,XXX
复现代码
import pandas as pd df = pd.read_csv('mock_data.csv') df['1'].iloc[1] = '\033[91m' + df['1'].iloc[1] + '\033[0m' print(df)
内容的提问来源于stack exchange,提问作者Rufus
相关产品推荐
相关产品推荐

