Pandas DataFrames:如何在不留白的情况下换行

Pandas DataFrames:如何在不留白的情况下换行

在本文中,我们将介绍如何在Pandas DataFrames中使文本自动换行而不留白。当DataFrame中的文本太长而无法完全显示时,文本就会自动截断并添加一个省略号。这可能会导致在查看数据时出现混淆。为了解决这个问题,我们可以使用Pandas Styler对象中的wrap方法来强制文本自动换行而不留白。
阅读更多:Pandas 教程

什么是Styler对象

在介绍Styler对象之前,可以先了解一下DataFrame对象如何在显示时格式化。Pandas提供了style属性来定义每个单元格的格式,例如,文本颜色,背景颜色,字体大小,等等。最常见的情况是设置单元格的颜色,以突出显示比较重要的数据。但是,style属性只会影响显示,而DataFrame对象本身与其内容没有任何关系。
Styler对象可以用来一步生成以HTML/CSS样式渲染的Pandas DataFrame.这个对象提供了许多方法和属性,用于对表格的样式进行自定义。
假如我们有一个数据框,其中包含很多文本内容,我们需要将每个单元格的文本都自动换行。在下面的示例中,我们将首先创建一个数据框,然后使用Pandas的Styler对象来修改样式并强制文本自动换行:

import pandas as pd

data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
        'Description': ['This is a long text that need to be wrapped without whitespace.',
                        'Another text without whitespace needs to be wrapped.',
                        'This is also a long text but has spaces between words.',
                        'This is a normal text.']}
df = pd.DataFrame(data)

def wrap_without_whitespace(text):
    return 'white-space: pre-wrap'

styles = [
    {'selector': 'td', 'props': [('white-space', 'nowrap')]},
    {'selector': 'td:last-child', 'props': [('white-space', 'pre-wrap')]},
    {'selector': 'td', 'props': [('text-align', 'left')]},
    {'selector': 'th', 'props': [('background-color', 'gray'), ('color', 'white'), ('text-align', 'center')]}
]

(df.style
 .set_properties(subset=df.columns[1:], **{'width': '300px', 'font-size': '10pt'})
 .set_table_styles(styles)
 .applymap(wrap_without_whitespace, subset=pd.IndexSlice[:, 'Description']))

在这个示例中,我们首先定义了一个函数,该函数将其输入文本重新格式化为自动换行但没有空白的样式。接下来,我们建立了四个样式变量来定义我们需要的样式。这里我们将第一列(Name)的单元格样式设置为nowrap,以防止名称单元格与描述单元格)的样式重叠。最后一列(Description)的单元格样式则设置为pre-wrap,这将强制文本自动换行。我们通过前面定义的函数来设置这个样式。

set_properties方法

现在,我们将使用set_properties方法来设置单元格的宽度和字体大小。首先,我们将subset参数设置为数据框中的所有列名称的切片。这将覆盖所有列,并将其列宽设置为300px
set_properties方法可以接受一些关键字参数来设置表格和字体样式属性,这取决于它们在CSS中的名称。

.set_properties(subset=df.columns[1:], **{'width': '300px', 'font-size': '10pt'})

现在,每个单元格的文本都自动换行而没有空白。但是,如果我们将键盘向右滚动,我们会发现表中的文本已经对齐,并且每个单元格都有空白。这就是我们需要使用样式表中的另一个样式变量的原因。

set_table_styles方法

我们将使用set_table_styles方法来设置表格样式。这个方法可以接受一组以CSS Selector作为键和CSS属性作为值的字典,用于自定义表格的样式。下面是我们在样式表中定义的样式:

styles = [
    {'selector': 'td', 'props': [('white-space', 'nowrap')]},
    {'selector': 'td:last-child', 'props': [('white-space', 'pre-wrap')]},
    {'selector': 'td', 'props': [('text-align', 'left')]},
    {'selector': 'th', 'props': [('background-color', 'gray'), ('color', 'white'), ('text-align', 'center')]}
]

通过设置表格样式为:
td:设置所有单元格的文本不自动换行。
td:last-child:为最后一列的单元格添加换行,然后删除单元格周围的空白。
tdth:设置文本对齐方式为左侧;设置表头背景颜色为灰色,字体颜色为白色,对齐方式为居中。
在样式表的最后一行中,applymap方法用于为Description列中的每个单元格应用wrap_without_whitespace函数。这将确保为每个单元格定义的样式将被应用。

.applymap(wrap_without_whitespace, subset=pd.IndexSlice[:, 'Description']))

现在,我们的Pandas DataFrame已经在没有留白的情况下自动换行了,每个单元格都具有相同的宽度,同时表格样式也被我们所定义的样式覆盖。

总结

Pandas DataFrames中的文本换行 容易出错和混淆。强制文本换行而不留白,可以使DataFrame数据更具可读性和易于阅读。我们可以使用Pandas DataFrames中的Styler类来自定义单元格样式、表格样式和单元格宽度,使用甚至更复杂样式的情况下,将更大的提升表格的可读性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程