请考虑以下示例:

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美元可以做到这一点,但显然并非如此.

我甚至try 在长列名中添加显式换行符,但它们只被呈现为\n,并且列名仍然在一行中(如Linebreaks in pandas column names中所述)

那么,是否可以在Pandas中使用"换行"/"换行"的长列名来输出纯文本字符串呢?

推荐答案

您可以使用textwrap.wraptabulate:

#  pip install tabulate
from textwrap import wrap
from tabulate import tabulate

df_colnames_wrap = {k: '\n'.join(wrap(v, 20))
                    for k,v in df_colnames.items()}

print(tabulate(df.rename(columns=df_colnames_wrap),
               headers='keys', tablefmt='plain'))

输出:

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

使用浮点格式:

print(tabulate(df.rename(columns=df_colnames_wrap)
                 .convert_dtypes(),
               headers='keys', tablefmt='plain',
               floatfmt='.2f'
              ))

输出:

      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

Python相关问答推荐

在函数内部使用eval(),将函数的输入作为字符串的一部分

使用mySQL的SQlalchemy过滤重叠时间段

pandas DataFrame GroupBy.diff函数的意外输出

根据不同列的值在收件箱中移动数据

将jit与numpy linSpace函数一起使用时出错

如何让剧作家等待Python中出现特定cookie(然后返回它)?

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

运行终端命令时出现问题:pip start anonymous"

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

基于索引值的Pandas DataFrame条件填充

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

迭代嵌套字典的值

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像

dask无groupby(ddf. agg([min,max])?''''

如何在PySide/Qt QColumbnView中删除列

将标签移动到matplotlib饼图中楔形块的开始处

30个非DATETIME天内的累计金额

如何从比较函数生成ngroup?

如何用FFT确定频变幅值

某些值的数值幂和**之间的差异