pandas:如何让.to_string()方法将列标题与列值对齐?[英] pandas: How to get .to_string() method to align column headers with column values?

本文是小编为大家收集整理的关于pandas:如何让.to_string()方法将列标题与列值对齐?的处理方法,想解了pandas:如何让.to_string()方法将列标题与列值对齐?的问题怎么解决?pandas:如何让.to_string()方法将列标题与列值对齐?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

这一直困扰着我一段时间,我觉得必须有一个解决方案,因为打印数据框总是将列标题与其各自的值对齐.

示例:

df = pd.DataFrame({'First column name': [1234, 2345, 3456], 'Second column name': [5432,4321,6543], 'Third column name': [1236,3457,3568]})
df_string = df.to_string(justify='left', col_space='30')


现在,当您打印 df_string 时,您将获得所需的格式:http://i.imgur.com/Xyoy4Op.png

但是当我获取字符串并查看它时(在这种情况下,我将字符串传递给显示文本的 PyQt 小部件),这是输出:http://i.imgur.com/a1NcBQA.png

(这是字符串在我的控制台上的显示方式):http://i.imgur.com/WRHEhKB.png



任何帮助是极大的赞赏.

推荐答案

这很好地排列了列标题:

print(df.to_string())

但这也会打印索引.如果您不想打印索引,您可以:

print(df.to_string(index=False)

问题是,列标题不再正确排列.

所以我写了这个 hack:

blanks = r'^ *([a-zA-Z_0-9-]*) .*$'
blanks_comp = re.compile(blanks)

def find_index_in_line(line):
    index = 0
    spaces = False
    for ch in line:
        if ch == ' ':
            spaces = True
        elif spaces:
            break
        index += 1
    return index

def pretty_to_string(df):
    lines = df.to_string().split('\n')
    header = lines[0]
    m = blanks_comp.match(header)
    indices = []
    if m:
        st_index = m.start(1)
        indices.append(st_index)

    non_header_lines = lines[1:len(lines)]

    for line in non_header_lines:
        index = find_index_in_line(line)
        indices.append(index)

    mn = np.min(indices)
    newlines = []
    for l in lines:
        newlines.append(l[mn:len(l)])

    return '\n'.join(newlines)

你这样调用:

print(pretty_to_string(df))

代码通过调用 df.to_string() (列很好地排列)并计算索引列占用的最大字符数.

然后它会从每一行中剥离索引.

本文地址:https://www.itbaoku.cn/post/1727917.html