旋转Pandas DataFrame的列名

yfwxisqw  于 2023-05-21  发布在  其他
关注(0)|答案(5)|浏览(157)

我正在尝试用pandas制作格式良好的表格。我的一些专栏名字太长了。这些列的单元格很大,导致整个表很乱。
在我的示例中,是否可以在显示列名时旋转列名?

data = [{'Way too long of a column to be reasonable':4,'Four?':4},
        {'Way too long of a column to be reasonable':5,'Four?':5}]
pd.DataFrame(data)

h7appiyu

h7appiyu1#

类似于:

data = [{'Way too long of a column to be reasonable':4,'Four?':4},
        {'Way too long of a column to be reasonable':5,'Four?':5}]
dfoo = pd.DataFrame(data)
dfoo.style.set_table_styles(
    [dict(selector="th",props=[('max-width', '80px')]),
        dict(selector="th.col_heading",
                 props=[("writing-mode", "vertical-rl"), 
                        ('transform', 'rotateZ(-90deg)'),
                        ])]
)

可能接近你想要的:

see result here

ybzsozfc

ybzsozfc2#

查看pybloqs source code以获得可接受答案的解决方案,我能够找到如何在不安装pybloqs的情况下旋转柱。请注意,这也会旋转索引,但我添加了代码来删除这些内容。

from IPython.display import HTML, display

data = [{'Way too long of a column to be reasonable':4,'Four?':4},
        {'Way too long of a column to be reasonable':5,'Four?':5}]
df = pd.DataFrame(data)

styles = [
    dict(selector="th", props=[("font-size", "125%"),
                               ("text-align", "center"),
                              ("transform", "translate(0%,-30%) rotate(-5deg)")
                              ]),
    dict(selector=".row_heading, .blank", props= [('display', 'none;')])
]

html = df.style.set_table_styles(styles).render()
display(HTML(html))

ha5z0ras

ha5z0ras3#

我把@Bobain的好答案放到一个函数中,这样我就可以在整个笔记本中重复使用它。

def format_vertical_headers(df):
    """Display a dataframe with vertical column headers"""
    styles = [dict(selector="th", props=[('width', '40px')]),
              dict(selector="th.col_heading",
                   props=[("writing-mode", "vertical-rl"),
                          ('transform', 'rotateZ(180deg)'), 
                          ('height', '290px'),
                          ('vertical-align', 'top')])]
    return (df.fillna('').style.set_table_styles(styles))

format_vertical_headers(pandas.DataFrame(data))

ddhy6vgd

ddhy6vgd4#

使用Python库'pybloqs'(http://pybloqs.readthedocs.io/en/latest/),可以旋转列名并在顶部添加填充。唯一的缺点(如文档所述)是顶部填充不能与Jupyter内联。必须导出该表。

import pandas as pd
from pybloqs import Block
import pybloqs.block.table_formatters as tf
from IPython.core.display import display, HTML

data = [{'Way too long of a column to be reasonable':4,'Four?':4},
        {'Way too long of a column to be reasonable':5,'Four?':5}]
dfoo =pd.DataFrame(data)

fmt_header = tf.FmtHeader(fixed_width='5cm',index_width='10%', 
                          top_padding='10cm', rotate_deg=60)
table_block = Block(dfoo, formatters=[fmt_header])

display(HTML(table_block.render_html()))
table_block.save('Table.html')

x6yk4ghg

x6yk4ghg5#

我可以让文本完全旋转90度,但不知道如何使用text-orientation: upright,因为它只是使文本不可见:(你错过了writing-mode属性,必须设置text-orientation才能有任何效果。另外,我通过对选择器进行一点修改,使其仅适用于列标题。
dfoo.style.set_table_styles([dict(selector="th.col_heading",props=[("writing-mode", "vertical-lr"),('text-orientation', 'upright')])])
希望这能让你更接近你的目标!

相关问题