将 Pandas 数据框中的列名称的长文本拆分/换行纯文本 to_string 输出?

问题描述 投票:0回答:1

考虑这个例子:

import pandas as pd

df = pd.DataFrame({
  "LIDSA": [0, 1, 2, 3],
  "CAE": [3, 5, 7, 9],
  "FILA": [1, 2, 3, 4], # 2 is default, so table idx 1 is default
  "VUAMA": [0.5, 1.0, 1.5, 2.0],
})
df_colnames = { # https://stackoverflow.com/q/48243818
  "LIDSA": "Lorem ipsum dolor sit amet",
  "CAE": "Consectetur adipiscing elit",
  "FILA": "Fusce imperdiet libero arcu",
  "VUAMA": "Vitae ultricies augue molestie ac",
}

# "Pandas autodetects the size of your terminal window if you set pd.options.display.width = 0" https://stackoverflow.com/q/11707586
with pd.option_context('display.max_rows', None, 'display.max_columns', None, 'display.width', 0, 'max_colwidth', 20, 'display.float_format', "{:.2f}".format):
  df_str = df.rename(df_colnames,axis=1).to_string()

print(df_str)

这会导致终端标准输出打印输出,当时宽度为 111 个字符:

   Lorem ipsum dolor sit amet  Consectetur adipiscing elit  Fusce imperdiet libero arcu  Vitae ultricies augue
 molestie ac
0                           0                            3                            1
        0.50
1                           1                            5                            2
        1.00
2                           2                            7                            3
        1.50
3                           3                            9                            4
        2.00

因此,只有最后一列被换行(相应地,它的值也被换行)。我希望每个长列名称在 20 个字符处换行/换行,然后相应地输出值,例如:

   Lorem ipsum dolor      Consectetur  Fusce imperdiet    Vitae ultricies
            sit amet  adipiscing elit      libero arcu  augue molestie ac
0                  0                3                1               0.50
1                  1                5                2               1.00
2                  2                7                3               1.50
3                  3                9                4               2.00

我以为

'max_colwidth', 20
会做到这一点,但显然事实并非如此。

我什至尝试在长列名称中添加显式换行符,但它们只是呈现为

\n
,并且列名称仍然在一行中(也如pandas 列名称中的换行符中所述)

那么,是否可以在 Pandas 中对长列名进行“自动换行”/“换行”以实现纯文本字符串输出?

python pandas dataframe word-wrap
1个回答
0
投票

当您将 DataFrame 转换为字符串时,Pandas 不提供自动换行或跨行换行长列名称的内置方法。名为 max_colwidth 的设置仅影响表内的数据,而不影响列标题本身。如果您尝试在列名称中添加自己的换行符,您会发现它们实际上并没有改变标题的显示方式;相反,你会看到“ " 输出中的字符,这不是您想要的。

要让您的列名称换行成多行,您必须发挥一点创意并自己完成。你需要:

编写一个函数,可以采用长列名并将其分解为较小的部分,每个部分足够短(例如,不超过 20 个字符)以适合自己的行。 使用此函数处理所有列名称,然后调整 DataFrame 的显示方式,使这些多行名称看起来正确。 此方法涉及手动更改列名称以在您想要的位置包含换行符,然后确保 DataFrame 的字符串表示形式(当您打印出来时)遵循这些换行符。这更多的是在实际打印或显示 DataFrame 之前准备数据和显示设置。

import pandas as pd

# Original DataFrame
df = pd.DataFrame({
    "LIDSA": [0, 1, 2, 3],
    "CAE": [3, 5, 7, 9],
    "FILA": [1, 2, 3, 4],
    "VUAMA": [0.5, 1.0, 1.5, 2.0],
})

# Dictionary with long column names
df_colnames = {
    "LIDSA": "Lorem ipsum dolor sit amet",
    "CAE": "Consectetur adipiscing elit",
    "FILA": "Fusce imperdiet libero arcu",
    "VUAMA": "Vitae ultricies augue molestie ac",
}

# Custom function to word-wrap text
def word_wrap(text, max_width):
    """
    Word-wrap text at a specified width. Attempts to break lines at word boundaries
    where possible.
    """
    words = text.split()
    lines = []
    current_line = []
    current_length = 0

    for word in words:
        if current_length + len(word) <= max_width:
            current_line.append(word)
            current_length += len(word) + 1  # +1 for space
        else:
            lines.append(' '.join(current_line))
            current_line = [word]
            current_length = len(word) + 1
    lines.append(' '.join(current_line))  # Add the last line

    return '\n'.join(lines)

# Apply word-wrap to column names
wrapped_colnames = {col: word_wrap(name, 20) for col, name in df_colnames.items()}

# Rename DataFrame columns
df = df.rename(columns=wrapped_colnames)

# Print the DataFrame with modified display settings
with pd.option_context('display.max_rows', None, 'display.max_columns', None, 'display.width', 0, 'max_colwidth', 20, 'display.float_format', "{:.2f}".format):
    print(df.to_string())
© www.soinside.com 2019 - 2024. All rights reserved.