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
:为最后一列的单元格添加换行,然后删除单元格周围的空白。
– td
和 th
:设置文本对齐方式为左侧;设置表头背景颜色为灰色,字体颜色为白色,对齐方式为居中。
在样式表的最后一行中,applymap
方法用于为Description
列中的每个单元格应用wrap_without_whitespace
函数。这将确保为每个单元格定义的样式将被应用。
.applymap(wrap_without_whitespace, subset=pd.IndexSlice[:, 'Description']))
现在,我们的Pandas DataFrame已经在没有留白的情况下自动换行了,每个单元格都具有相同的宽度,同时表格样式也被我们所定义的样式覆盖。
总结
Pandas DataFrames中的文本换行 容易出错和混淆。强制文本换行而不留白,可以使DataFrame数据更具可读性和易于阅读。我们可以使用Pandas DataFrames中的Styler
类来自定义单元格样式、表格样式和单元格宽度,使用甚至更复杂样式的情况下,将更大的提升表格的可读性。