我使用 Python3 字典来保存以下格式的嵌套数据:
{'col1':
{'row1': '1_1',
'row2': '1_2'},
'col2':
{'row1': '2_1',
'row2': '2_2'},
...
}
列标题的长度均为 2 个字符,即。 “C1”,而行标题的长度最多可达 30 个字符。行值的长度最多为 20 个字符,并夹在外壳颜色字符串之间(即“\033[95m”),但平均为 3 个。
当我将字典传递到数据框中并打印它时,我得到的输出类似于下面的代码片段。
C1 C2 C3 ...
row1_name 1_1 1_2 1_3 1_4 1_5 1_6 1_7 1_8 1_9 ...
row2_name 2_1 2_2 2_3 2_4 2_5 2_6 2_7 2_8 2_9 ...
row3_n... 3_1 3_2 3_3 3_4 3_5 3_6 3_7 3_8 3_9 ...
列标题分布在终端的整个宽度上,而列则仅分布在必要的宽度上,以根据每列中数据的最大宽度来容纳它们。即使仅显示第一列和最后几列,中间带有省略号(即 C1 C2 C3 ... C18 C19 C20),情况也是如此。
需要明确的是,显示的列和标题数量相同,但宽度不同。此外,问题不是我没有显示所有列,而是我显示的列与标题不对齐。
我期望默认情况下列与标题对齐,但我之前没有使用字典来存储 DF 的数据。我尝试使用 pd.set_option('display.max_colwidth', 20) 设置最大列宽度,它减少了标题的间距,但还不够。当我将其设置为 10 时,列值变成单个字符,而每个标题之间仍然有多个空格。
编辑1:
当尝试生成模拟数据时,我删除了解决问题的颜色字符串。显然,用 shell 颜色代码包围数据值会增加 pd 列标题的宽度,但不会增加值的宽度。
编辑2:
问题已解决:我向列标题添加了转义码(与颜色代码的长度相同)。这正确对齐了列。似乎是 Pandas 的一个错误。
重现:
- 将 csv 文件保存到mock_data.csv
- 将数据加载到 pd 数据框
- 将任何数据值替换为由颜色代码包围的自身值
- 打印 DF
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)
最佳答案
这里的问题是 Pandas 的显示错误。每个单元格中的值夹在 bash 颜色代码转义序列之间,例如:"\033[91msVALUE\033[0m"
。此示例的单元格中有 14 个隐藏字符。然后,Pandas 将转义字符包含在列标题的总列宽中(但在显示单元格时不包含)。
解决方法:
我向列标题添加了颜色/结束代码。这消除了额外的间距。颜色代码必须与正文和标题中的字符数相同才能正常工作。在我的解决方案中,我将标题的颜色设置为 CYAN='\033[96m'
,因为它的字符数与正文相同 (RED='\033[91m'
/GREEN='\033[92m'
)。这意味着对于我的示例,样式选项如 BOLD='\033[1m'
、UNDERLINE='\033[4m'
和 WHITE='\033如果应用于标题,[0m'
将无法正确对齐文本。
header 已使用以下代码更新:
def color_columns(column):
return bash_colors.CYAN + column + bash_colors.END
display_df.columns = color_columns(df.columns)
GitHub - Bug Report
关于python - Pandas DF 列标题与列不对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77095741/