python - Pandas DF 列标题与列不对齐

标签 python python-3.x pandas dataframe format

我使用 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/

相关文章:

python - 将 DataFrame 拆分为仅包含给定常量值的组

pandas - 将几列转换为 epoch pandas

python - 当值不满足任何边界时如何在 pandas.cut() 上给出标签

python - 当我在 tkinter 中使用条目时,我得到空字符串

python - CSV 到字典列表 - 更好的方法?

python - 类型错误:module() 最多接受 2 个参数(给定 3 个)从复数类(class)中获取的代码

python - tensorflow 输入管道和性能-图像

python - 使用DataBase和Dict添加菜单和触发器

python - 使用 pandas 从 CSV 加载随机样本

Python Pandas 自定义日期时间索引