表格可视化#

本节演示使用 Styler 类可视化表格数据。有关使用图表进行可视化的信息,请参阅 Chart Visualization 。本文档以 Jupyter Notebook 的形式编写,可以 here 查看或下载。

Styler 对象和自定义显示#

样式和输出显示自定义应该**在** DataFrame 中的数据被处理**之后**执行。如果 DataFrame 发生进一步更改,Styler **不会**动态更新。DataFrame.style 属性是一个返回 Styler 对象的属性。它定义了 _repr_html_ 方法,因此在 Jupyter Notebook 中会自动渲染。

Styler 可以用于大数据,但主要设计用于小数据,目前支持输出到以下格式:

  • HTML

  • LaTeX

  • String(以及 CSV 扩展)

  • Excel

  • (JSON 目前不可用)

前三种格式都有设计用于格式化和自定义输出的显示自定义方法。这些方法包括:

格式化显示#

格式化值#

Styler 在数据值和索引或列标题中区分*显示*值和*实际*值。要控制显示值,文本将作为字符串打印在每个单元格中,我们可以使用 .format().format_index() 方法根据 format spec string 或接受单个值并返回字符串的可调用对象来操作。可以为整个表、索引、单个列或 MultiIndex 级别定义此设置。我们还可以覆盖索引名称。

此外,format 函数还有一个 precision 参数专门用于格式化浮点数,以及用于支持其他语言环境的 decimalthousands 分隔符,一个 na_rep 参数用于显示缺失数据,以及 escapehyperlinks 参数用于显示安全的 HTML 或安全的 LaTeX。默认格式化程序配置为采用 pandas 的全局选项,例如 styler.format.precision 选项,可以使用 with pd.option_context('format.precision', 2): 进行控制。

[2]:
import pandas as pd
import numpy as np
import matplotlib as mpl

df = pd.DataFrame({
    "strings": ["Adam", "Mike"],
    "ints": [1, 3],
    "floats": [1.123, 1000.23]
})
df.style \
  .format(precision=3, thousands=".", decimal=",") \
  .format_index(str.upper, axis=1) \
  .relabel_index(["row 1", "row 2"], axis=0)
[2]:
  STRINGS INTS FLOATS
row 1 Adam 1 1,123
row 2 Mike 3 1.000,230

使用 Styler manipulate 显示是一个有用的功能,因为为其他目的维护索引和数据值可以提供更大的控制。您不必覆盖 DataFrame 即可按所需方式显示它。这是一个在仍依赖底层数据进行索引和计算的同时使用格式化函数的更全面的示例。

[3]:
weather_df = pd.DataFrame(np.random.rand(10,2)*5,
                          index=pd.date_range(start="2021-01-01", periods=10),
                          columns=["Tokyo", "Beijing"])

def rain_condition(v):
    if v < 1.75:
        return "Dry"
    elif v < 2.75:
        return "Rain"
    return "Heavy Rain"

def make_pretty(styler):
    styler.set_caption("Weather Conditions")
    styler.format(rain_condition)
    styler.format_index(lambda v: v.strftime("%A"))
    styler.background_gradient(axis=None, vmin=1, vmax=5, cmap="YlGnBu")
    return styler

weather_df
[3]:
Tokyo Beijing
2021-01-01 0.396665 1.600105
2021-01-02 1.197922 0.591205
2021-01-03 2.098933 3.540727
2021-01-04 3.752402 4.475308
2021-01-05 4.660665 2.680919
2021-01-06 0.199466 0.364023
2021-01-07 0.765136 3.671220
2021-01-08 4.230974 1.063453
2021-01-09 4.011464 0.537081
2021-01-10 4.503393 4.556414
[4]:
weather_df.loc["2021-01-04":"2021-01-08"].style.pipe(make_pretty)
[4]:
Weather Conditions
  Tokyo Beijing
Monday Heavy Rain Heavy Rain
Tuesday Heavy Rain Rain
Wednesday Dry Dry
Thursday Dry Heavy Rain
Friday Heavy Rain Dry

隐藏数据#

索引和列标题可以完全隐藏,也可以通过子选择要排除的行或列来隐藏。这两种选项都使用相同的方法执行。

调用不带任何参数的 .hide() 可以隐藏渲染的索引,这在使用基于整数的索引时可能很有用。类似地,调用不带任何其他参数的 .hide(axis=”columns”) 可以隐藏列标题。

可以通过调用相同的 .hide() 方法并将行/列标签、类列表或行/列标签切片传递给 subset 参数来隐藏要从渲染中排除的特定行或列。

隐藏不会改变 CSS 类的整数排列,例如,隐藏 DataFrame 的前两列意味着列类索引仍将从 col2 开始,因为 col0col1 被简单地忽略了。

[5]:
df = pd.DataFrame(np.random.randn(5, 5))
df.style \
  .hide(subset=[0, 2, 4], axis=0) \
  .hide(subset=[0, 2, 4], axis=1)
[5]:
  1 3
1 -0.523127 -0.226054
3 0.465351 0.467073

将函数反转为 显示 功能的最佳实践是组合一个隐藏项的列表。

[6]:
show = [0, 2, 4]
df.style \
  .hide([row for row in df.index if row not in show], axis=0) \
  .hide([col for col in df.columns if col not in show], axis=1)
[6]:
  0 2 4
0 0.601083 -0.105902 0.439183
2 -1.670804 -1.287116 0.457112
4 0.629013 -2.045214 -0.083312

连接 DataFrame 输出#

只要它们共享相同的列,就可以连接两个或多个 Styler。这对于显示 DataFrame 的汇总统计信息非常有用,并且经常与 DataFrame.agg 结合使用。

由于连接的对象是 Styler,因此可以独立对它们进行样式设置,如下所示,它们的连接会保留这些样式。

[7]:
summary_styler = df.agg(["sum", "mean"]).style \
                   .format(precision=3) \
                   .relabel_index(["Sum", "Average"])
df.style.format(precision=1).concat(summary_styler)
[7]:
  0 1 2 3 4
0 0.6 0.2 -0.1 -0.5 0.4
1 0.0 -0.5 0.6 -0.2 0.7
2 -1.7 -0.8 -1.3 0.5 0.5
3 0.3 0.5 0.3 0.5 0.9
4 0.6 1.4 -2.0 2.2 -0.1
Sum -0.094 0.820 -2.498 2.429 2.363
Average -0.019 0.164 -0.500 0.486 0.473

Styler 对象和 HTML#

Styler 最初是为了支持广泛的 HTML 格式选项而构造的。其 HTML 输出会创建一个 HTML <table> 并利用 CSS 样式语言来操作许多参数,包括颜色、字体、边框、背景等。有关样式设置 HTML 表的更多信息,请参见 here 。这提供了开箱即用的灵活性,甚至使 Web 开发人员能够将 DataFrame 集成到他们现有的用户界面设计中。

下面我们演示默认输出,它看起来与标准的 DataFrame HTML 表示非常相似。但是,即使我们还没有创建任何样式,HTML 已经为每个单元格附加了一些 CSS 类。我们可以通过调用 .to_html() 方法来查看这些,该方法将原始 HTML 返回为字符串,这对于进一步处理或添加到文件很有用——请继续阅读 More about CSS and HTML 。本节还将介绍如何将此默认输出转换为更具交流性的 DataFrame 输出。例如,我们如何构建 s

[8]:
df = pd.DataFrame([[38.0, 2.0, 18.0, 22.0, 21, np.nan],[19, 439, 6, 452, 226,232]],
                  index=pd.Index(['Tumour (Positive)', 'Non-Tumour (Negative)'], name='Actual Label:'),
                  columns=pd.MultiIndex.from_product([['Decision Tree', 'Regression', 'Random'],['Tumour', 'Non-Tumour']], names=['Model:', 'Predicted:']))
df.style
[8]:
Model: Decision Tree Regression Random
Predicted: Tumour Non-Tumour Tumour Non-Tumour Tumour Non-Tumour
Actual Label:            
Tumour (Positive) 38.000000 2.000000 18.000000 22.000000 21 nan
Non-Tumour (Negative) 19.000000 439.000000 6.000000 452.000000 226 232.000000
[10]:
s
[10]:
Confusion matrix for multiple cancer prediction models.
Model: Decision Tree Regression
Predicted: Tumour Non-Tumour Tumour Non-Tumour
Actual Label:        
Tumour (Positive) 38 2 18 22
Non-Tumour (Negative) 19 439 6 452

我们采取的第一个步骤是从 DataFrame 创建 Styler 对象,然后通过使用 .hide() 隐藏不需要的列来选择感兴趣的范围。

[11]:
s = df.style.format('{:.0f}').hide([('Random', 'Tumour'), ('Random', 'Non-Tumour')], axis="columns")
s
[11]:
Model: Decision Tree Regression
Predicted: Tumour Non-Tumour Tumour Non-Tumour
Actual Label:        
Tumour (Positive) 38 2 18 22
Non-Tumour (Negative) 19 439 6 452

添加样式的函数#

There are 3 primary methods of adding custom CSS styles to Styler:

  • 使用 .set_table_styles() 来控制表格的更广泛区域,并使用指定的内部 CSS。虽然表格样式提供了添加 CSS 选择器和控制表格所有单独部分的属性的灵活性,但它们对于单个单元格的指定来说很不方便。此外,请注意,表格样式无法导出到 Excel。

  • 使用 .set_td_classes() 直接将外部 CSS 类链接到数据单元格,或链接由 .set_table_styles() 创建的内部 CSS 类。参见 here 。这些不能用于列标题行或索引,也不会导出到 Excel。

  • 使用 .apply().map() 函数为特定数据单元格添加直接的内部 CSS。参见 here 。从 v1.4.0 开始,还有直接在列标题行或索引上工作的函数;.apply_index().map_index() 。请注意,只有这些函数添加的样式才能导出到 Excel。这些函数的工作方式类似于 DataFrame.apply()DataFrame.map()

表格样式#

表格样式足够灵活,可以控制表格的所有单独部分,包括列标题和索引。然而,对于单个数据单元格或任何类型的条件格式来说,键入它们可能很不方便,因此我们建议将表格样式用于广泛的样式设置,例如一次设置整行或整列。

表格样式还用于一次性控制适用于整个表格的功能,例如创建通用的悬停功能。:hover 伪选择器以及其他伪选择器只能通过这种方式使用。

为了复制 CSS 选择器和属性(属性值对)的常规格式,例如:

tr:hover {
  background-color: #ffff99;
}

将样式传递给 .set_table_styles() 所需的格式是字典列表,每个字典都包含一个 CSS 选择器标签和 CSS 属性。属性可以是 2 元组的列表,也可以是常规 CSS 字符串,例如:

[13]:
cell_hover = {  # for row hover use <tr> instead of <td>
    'selector': 'td:hover',
    'props': [('background-color', '#ffffb3')]
}
index_names = {
    'selector': '.index_name',
    'props': 'font-style: italic; color: darkgrey; font-weight:normal;'
}
headers = {
    'selector': 'th:not(.index_name)',
    'props': 'background-color: #000066; color: white;'
}
s.set_table_styles([cell_hover, index_names, headers])
[13]:
Model: Decision Tree Regression
Predicted: Tumour Non-Tumour Tumour Non-Tumour
Actual Label:        
Tumour (Positive) 38 2 18 22
Non-Tumour (Negative) 19 439 6 452

接下来,我们再添加一些针对表格特定部分的样式。在这里要小心,因为我们是在 链接方法,所以我们需要明确指示方法 不要 ``overwrite``(覆盖)现有样式。

[15]:
s.set_table_styles([
    {'selector': 'th.col_heading', 'props': 'text-align: center;'},
    {'selector': 'th.col_heading.level0', 'props': 'font-size: 1.5em;'},
    {'selector': 'td', 'props': 'text-align: center; font-weight: bold;'},
], overwrite=False)
[15]:
Model: Decision Tree Regression
Predicted: Tumour Non-Tumour Tumour Non-Tumour
Actual Label:        
Tumour (Positive) 38 2 18 22
Non-Tumour (Negative) 19 439 6 452

作为一个便捷方法(自 1.2.0 版本起),我们也可以将一个 字典 传递给 .set_table_styles() ,该字典包含行或列的键。在后台,Styler 只是索引这些键,并根据需要将相关的 .col<m>.row<n> 类添加到给定的 CSS 选择器中。

[17]:
s.set_table_styles({
    ('Regression', 'Tumour'): [{'selector': 'th', 'props': 'border-left: 1px solid white'},
                               {'selector': 'td', 'props': 'border-left: 1px solid #000066'}]
}, overwrite=False, axis=0)
[17]:
Model: Decision Tree Regression
Predicted: Tumour Non-Tumour Tumour Non-Tumour
Actual Label:        
Tumour (Positive) 38 2 18 22
Non-Tumour (Negative) 19 439 6 452

设置类和链接到外部 CSS#

如果您设计过网站,那么您可能已经有一个外部 CSS 文件,该文件控制着其中表格和单元格对象的样式。您可能希望使用这些本机文件,而不是在 Python 中复制所有 CSS(并复制任何维护工作)。

表格属性#

使用 .set_table_attributes() 为主 <table> 添加 class 非常简单。此方法还可以附加内联样式 - 有关更多信息,请参阅 CSS Hierarchies 。

[19]:
out = s.set_table_attributes('class="my-table-cls"').to_html()
print(out[out.find('<table'):][:109])
<table id="T_xyz01" class="my-table-cls">
  <thead>
    <tr>
      <th class="index_name level0" >Model:</th>

数据单元格 CSS 类#

1.2.0 版本新增

.set_td_classes() 方法接受一个 DataFrame,其索引和列与基础 Styler 的 DataFrame 匹配。该 DataFrame 将包含作为 css-class 的字符串,用于添加到各个数据单元格:<table><td> 元素。与其使用外部 CSS,不如在内部创建类并将其添加到表格样式中。我们将推迟添加边框,直到 section on tooltips 部分。

[20]:
s.set_table_styles([  # create internal CSS classes
    {'selector': '.true', 'props': 'background-color: #e6ffe6;'},
    {'selector': '.false', 'props': 'background-color: #ffe6e6;'},
], overwrite=False)
cell_color = pd.DataFrame([['true ', 'false ', 'true ', 'false '],
                           ['false ', 'true ', 'false ', 'true ']],
                          index=df.index,
                          columns=df.columns[:4])
s.set_td_classes(cell_color)
[20]:
Model: Decision Tree Regression
Predicted: Tumour Non-Tumour Tumour Non-Tumour
Actual Label:        
Tumour (Positive) 38 2 18 22
Non-Tumour (Negative) 19 439 6 452

Styler 函数#

作用于数据#

我们使用以下方法来传递样式函数。这两种方法都接受一个函数(以及一些其他关键字参数),并以某种方式将其应用于 DataFrame,从而呈现 CSS 样式。

  • .map() (逐元素):接受一个函数,该函数采用单个值并返回一个带 CSS 属性-值对的字符串。

  • .apply() (按列/行/表):接受一个函数,该函数采用 Series 或 DataFrame,并返回一个形状相同的 Series、DataFrame 或 numpy 数组,其中每个元素都是一个带 CSS 属性-值对的字符串。此方法根据 axis 关键字参数,一次将 DataFrame 的每一列或每一行,或者一次将整个表传递过去。对于按列操作,请使用 axis=0;对于按行操作,请使用 axis=1;对于一次性处理整个表,请使用 axis=None

此方法在将多个复杂逻辑应用于数据单元格方面非常强大。我们创建一个新的 DataFrame 来演示这一点。

[22]:
np.random.seed(0)
df2 = pd.DataFrame(np.random.randn(10,4), columns=['A','B','C','D'])
df2.style
[22]:
  A B C D
0 1.764052 0.400157 0.978738 2.240893
1 1.867558 -0.977278 0.950088 -0.151357
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
4 1.494079 -0.205158 0.313068 -0.854096
5 -2.552990 0.653619 0.864436 -0.742165
6 2.269755 -1.454366 0.045759 -0.187184
7 1.532779 1.469359 0.154947 0.378163
8 -0.887786 -1.980796 -0.347912 0.156349
9 1.230291 1.202380 -0.387327 -0.302303

例如,我们可以构建一个函数,在文本为负数时将其着色,然后将其链接到一个函数,该函数会淡化可忽略值的单元格。由于这是逐个元素进行的,因此我们使用 map

[23]:
def style_negative(v, props=''):
    return props if v < 0 else None
s2 = df2.style.map(style_negative, props='color:red;')\
              .map(lambda v: 'opacity: 20%;' if (v < 0.3) and (v > -0.3) else None)
s2
[23]:
  A B C D
0 1.764052 0.400157 0.978738 2.240893
1 1.867558 -0.977278 0.950088 -0.151357
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
4 1.494079 -0.205158 0.313068 -0.854096
5 -2.552990 0.653619 0.864436 -0.742165
6 2.269755 -1.454366 0.045759 -0.187184
7 1.532779 1.469359 0.154947 0.378163
8 -0.887786 -1.980796 -0.347912 0.156349
9 1.230291 1.202380 -0.387327 -0.302303

我们还可以构建一个函数,以一次性突出显示行、列和整个 DataFrame 中的最大值。在这种情况下,我们使用 apply。下面我们突出显示列中的最大值。

[25]:
def highlight_max(s, props=''):
    return np.where(s == np.nanmax(s.values), props, '')
s2.apply(highlight_max, props='color:white;background-color:darkblue', axis=0)
[25]:
  A B C D
0 1.764052 0.400157 0.978738 2.240893
1 1.867558 -0.977278 0.950088 -0.151357
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
4 1.494079 -0.205158 0.313068 -0.854096
5 -2.552990 0.653619 0.864436 -0.742165
6 2.269755 -1.454366 0.045759 -0.187184
7 1.532779 1.469359 0.154947 0.378163
8 -0.887786 -1.980796 -0.347912 0.156349
9 1.230291 1.202380 -0.387327 -0.302303

我们可以对不同的轴使用相同的函数,这里用紫色突出显示 DataFrame 中的最大值,粉色突出显示行最大值。

[27]:
s2.apply(highlight_max, props='color:white;background-color:pink;', axis=1)\
  .apply(highlight_max, props='color:white;background-color:purple', axis=None)
[27]:
  A B C D
0 1.764052 0.400157 0.978738 2.240893
1 1.867558 -0.977278 0.950088 -0.151357
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
4 1.494079 -0.205158 0.313068 -0.854096
5 -2.552990 0.653619 0.864436 -0.742165
6 2.269755 -1.454366 0.045759 -0.187184
7 1.532779 1.469359 0.154947 0.378163
8 -0.887786 -1.980796 -0.347912 0.156349
9 1.230291 1.202380 -0.387327 -0.302303

最后一个示例展示了某些样式如何被其他样式覆盖。通常,最后应用的样式是有效的,但您可以阅读 section on CSS hierarchies 部分以了解更多信息。您还可以将这些样式应用于 DataFrame 的更精细部分 - 有关更多信息,请参阅 subset slicing 部分。

仅使用类也可以实现其中一些功能,但这可能会更麻烦。请参阅 item 3) of Optimization 中的 item 3)

调试技巧:如果您在编写样式函数时遇到问题,请尝试将其传递给 DataFrame.apply。内部而言,Styler.apply 使用 DataFrame.apply,因此结果应该相同,并且使用 DataFrame.apply,您将能够检查每个单元格中目标函数的 CSS 字符串输出。

操作索引和列标题#

类似的应用通过以下方式实现:

  • .map_index() (元素级):接受一个函数,该函数接受单个值并返回一个带有 CSS 属性-值对的字符串。

  • .apply_index() (级别级):接受一个函数,该函数接受一个 Series 并返回一个 Series,或一个具有相同形状的 numpy 数组,其中每个元素都是一个带有 CSS 属性-值对的字符串。此方法一次传递您的索引的每个级别。要样式化索引,请使用 axis=0,要样式化列标题,请使用 axis=1

您可以选择 MultiIndex 的一个 level,但目前这些方法没有类似的 subset 应用。

[29]:
s2.map_index(lambda v: "color:pink;" if v>4 else "color:darkblue;", axis=0)
s2.apply_index(lambda s: np.where(s.isin(["A", "B"]), "color:pink;", "color:darkblue;"), axis=1)
[29]:
  A B C D
0 1.764052 0.400157 0.978738 2.240893
1 1.867558 -0.977278 0.950088 -0.151357
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
4 1.494079 -0.205158 0.313068 -0.854096
5 -2.552990 0.653619 0.864436 -0.742165
6 2.269755 -1.454366 0.045759 -0.187184
7 1.532779 1.469359 0.154947 0.378163
8 -0.887786 -1.980796 -0.347912 0.156349
9 1.230291 1.202380 -0.387327 -0.302303

工具提示和标题#

可以使用 .set_caption() 方法添加表格标题。您可以使用表格样式来控制与标题相关的 CSS。

[30]:
s.set_caption("Confusion matrix for multiple cancer prediction models.")\
 .set_table_styles([{
     'selector': 'caption',
     'props': 'caption-side: bottom; font-size:1.25em;'
 }], overwrite=False)
[30]:
Confusion matrix for multiple cancer prediction models.
Model: Decision Tree Regression
Predicted: Tumour Non-Tumour Tumour Non-Tumour
Actual Label:        
Tumour (Positive) 38 2 18 22
Non-Tumour (Negative) 19 439 6 452

添加工具提示(自 1.3.0 版本起)可以使用 .set_tooltips() 方法,就像您可以向数据单元格添加 CSS 类一样,通过提供一个具有相交索引和列的基于字符串的 DataFrame。您无需为工具提示指定 css_class 名称或任何 CSS props,因为有标准默认值,但如果您想要更多的视觉控制,该选项是存在的。

[32]:
tt = pd.DataFrame([['This model has a very strong true positive rate',
                    "This model's total number of false negatives is too high"]],
                  index=['Tumour (Positive)'], columns=df.columns[[0,3]])
s.set_tooltips(tt, props='visibility: hidden; position: absolute; z-index: 1; border: 1px solid #000066;'
                         'background-color: white; color: #000066; font-size: 0.8em;'
                         'transform: translate(0px, -24px); padding: 0.6em; border-radius: 0.5em;')
[32]:
Confusion matrix for multiple cancer prediction models.
Model: Decision Tree Regression
Predicted: Tumour Non-Tumour Tumour Non-Tumour
Actual Label:        
Tumour (Positive) 38 2 18 22
Non-Tumour (Negative) 19 439 6 452

为了使表格能够吸引观众注意工具提示,我们所要做的就是添加突出显示的边框。我们将像以前一样使用表格样式创建内部 CSS 类。设置类将始终覆盖,因此我们需要确保添加以前的类。

[34]:
s.set_table_styles([  # create internal CSS classes
    {'selector': '.border-red', 'props': 'border: 2px dashed red;'},
    {'selector': '.border-green', 'props': 'border: 2px dashed green;'},
], overwrite=False)
cell_border = pd.DataFrame([['border-green ', ' ', ' ', 'border-red '],
                           [' ', ' ', ' ', ' ']],
                          index=df.index,
                          columns=df.columns[:4])
s.set_td_classes(cell_color + cell_border)
[34]:
Confusion matrix for multiple cancer prediction models.
Model: Decision Tree Regression
Predicted: Tumour Non-Tumour Tumour Non-Tumour
Actual Label:        
Tumour (Positive) 38 2 18 22
Non-Tumour (Negative) 19 439 6 452

通过切片进行更精细控制#

我们到目前为止为 Styler.applyStyler.map 函数展示的示例并未演示 subset 参数的使用。这是一个有用的参数,提供了很大的灵活性:它允许您将样式应用于特定行或列,而无需在样式函数中编写该逻辑。

传递给 subset 的值类似于对 DataFrame 进行切片;

  • 标量被视为列标签

  • 列表(或 Series 或 NumPy 数组)被视为多个列标签

  • 元组被视为 (row_indexer, column_indexer)

可以考虑使用 pd.IndexSlice 来构建最后一个元组。我们将创建一个 MultiIndexed DataFrame 来演示此功能。

[36]:
df3 = pd.DataFrame(np.random.randn(4,4),
                   pd.MultiIndex.from_product([['A', 'B'], ['r1', 'r2']]),
                   columns=['c1','c2','c3','c4'])
df3
[36]:
c1 c2 c3 c4
A r1 -1.048553 -1.420018 -1.706270 1.950775
r2 -0.509652 -0.438074 -1.252795 0.777490
B r1 -1.613898 -0.212740 -0.895467 0.386902
r2 -0.510805 -1.180632 -0.028182 0.428332

我们将使用 subset 以红色文本突出显示第三列和第四列中的最大值。我们将用黄色突出显示被切片的子集区域。

[37]:
slice_ = ['c3', 'c4']
df3.style.apply(highlight_max, props='color:red;', axis=0, subset=slice_)\
         .set_properties(**{'background-color': '#ffffb3'}, subset=slice_)
[37]:
    c1 c2 c3 c4
A r1 -1.048553 -1.420018 -1.706270 1.950775
r2 -0.509652 -0.438074 -1.252795 0.777490
B r1 -1.613898 -0.212740 -0.895467 0.386902
r2 -0.510805 -1.180632 -0.028182 0.428332

如果结合建议的 IndexSlice,则可以更灵活地跨两个维度进行索引。

[38]:
idx = pd.IndexSlice
slice_ = idx[idx[:,'r1'], idx['c2':'c4']]
df3.style.apply(highlight_max, props='color:red;', axis=0, subset=slice_)\
         .set_properties(**{'background-color': '#ffffb3'}, subset=slice_)
[38]:
    c1 c2 c3 c4
A r1 -1.048553 -1.420018 -1.706270 1.950775
r2 -0.509652 -0.438074 -1.252795 0.777490
B r1 -1.613898 -0.212740 -0.895467 0.386902
r2 -0.510805 -1.180632 -0.028182 0.428332

这在使用 axis=1 时也提供了选择行的灵活性。

[39]:
slice_ = idx[idx[:,'r2'], :]
df3.style.apply(highlight_max, props='color:red;', axis=1, subset=slice_)\
         .set_properties(**{'background-color': '#ffffb3'}, subset=slice_)
[39]:
    c1 c2 c3 c4
A r1 -1.048553 -1.420018 -1.706270 1.950775
r2 -0.509652 -0.438074 -1.252795 0.777490
B r1 -1.613898 -0.212740 -0.895467 0.386902
r2 -0.510805 -1.180632 -0.028182 0.428332

同样,也可以提供**条件过滤**。

假设我们只想在我们希望突出显示第二列和第四列中的最大值,并且仅在第一列和第三列的总和小于 -2.0 的情况下才这样做(本质上排除行*``(:,’r2’)``)*。

[40]:
slice_ = idx[idx[(df3['c1'] + df3['c3']) < -2.0], ['c2', 'c4']]
df3.style.apply(highlight_max, props='color:red;', axis=1, subset=slice_)\
         .set_properties(**{'background-color': '#ffffb3'}, subset=slice_)
[40]:
    c1 c2 c3 c4
A r1 -1.048553 -1.420018 -1.706270 1.950775
r2 -0.509652 -0.438074 -1.252795 0.777490
B r1 -1.613898 -0.212740 -0.895467 0.386902
r2 -0.510805 -1.180632 -0.028182 0.428332

目前仅支持基于标签的切片,不支持基于位置的切片,也不支持可调用对象。

如果您的样式函数使用 subsetaxis 关键字参数,请考虑将您的函数包装在 functools.partial 中,并部分输出该关键字。

my_func2 = functools.partial(my_func, subset=42)

优化#

通常,对于较小的表格和大多数情况,渲染的 HTML 不需要优化,我们也不太推荐这样做。有两种情况值得考虑:

  • 如果您正在渲染和样式化非常大的 HTML 表格,某些浏览器存在性能问题。

  • 如果您正在使用 Styler 动态创建部分在线用户界面并希望提高网络性能。

在此,我们建议按照以下步骤进行实现:

1. 删除 UUID 和 cell_ids#

忽略 uuid 并将 cell_ids 设置为 False。这将避免生成不必要的 HTML。

这样效率较低:

[41]:
df4 = pd.DataFrame([[1,2],[3,4]])
s4 = df4.style

这样效果更好:

[42]:
from pandas.io.formats.style import Styler
s4 = Styler(df4, uuid_len=0, cell_ids=False)

2. 使用表格样式#

尽可能使用表格样式(例如,一次为所有单元格、行或列应用样式),因为 CSS 的效率几乎总是比其他格式高。

这样效率较低:

[43]:
props = 'font-family: "Times New Roman", Times, serif; color: #e83e8c; font-size:1.3em;'
df4.style.map(lambda x: props, subset=[1])
[43]:
  0 1
0 1 2
1 3 4

这样效果更好:

[44]:
df4.style.set_table_styles([{'selector': 'td.col1', 'props': props}])
[44]:
  0 1
0 1 2
1 3 4

3. 设置类而不是使用 Styler 函数#

对于应用于许多单元格且样式相同的超大 DataFrame,将其样式声明为类,然后将这些类应用于数据单元格(而不是直接将样式应用于单元格)会更有效。但是,当您不关心优化时,使用 Styler 函数 API 可能仍然更简单。

这样效率较低:

[45]:
df2.style.apply(highlight_max, props='color:white;background-color:darkblue;', axis=0)\
         .apply(highlight_max, props='color:white;background-color:pink;', axis=1)\
         .apply(highlight_max, props='color:white;background-color:purple', axis=None)
[45]:
  A B C D
0 1.764052 0.400157 0.978738 2.240893
1 1.867558 -0.977278 0.950088 -0.151357
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
4 1.494079 -0.205158 0.313068 -0.854096
5 -2.552990 0.653619 0.864436 -0.742165
6 2.269755 -1.454366 0.045759 -0.187184
7 1.532779 1.469359 0.154947 0.378163
8 -0.887786 -1.980796 -0.347912 0.156349
9 1.230291 1.202380 -0.387327 -0.302303

这样效果更好:

[46]:
build = lambda x: pd.DataFrame(x, index=df2.index, columns=df2.columns)
cls1 = build(df2.apply(highlight_max, props='cls-1 ', axis=0))
cls2 = build(df2.apply(highlight_max, props='cls-2 ', axis=1, result_type='expand').values)
cls3 = build(highlight_max(df2, props='cls-3 '))
df2.style.set_table_styles([
    {'selector': '.cls-1', 'props': 'color:white;background-color:darkblue;'},
    {'selector': '.cls-2', 'props': 'color:white;background-color:pink;'},
    {'selector': '.cls-3', 'props': 'color:white;background-color:purple;'}
]).set_td_classes(cls1 + cls2 + cls3)
[46]:
  A B C D
0 1.764052 0.400157 0.978738 2.240893
1 1.867558 -0.977278 0.950088 -0.151357
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
4 1.494079 -0.205158 0.313068 -0.854096
5 -2.552990 0.653619 0.864436 -0.742165
6 2.269755 -1.454366 0.045759 -0.187184
7 1.532779 1.469359 0.154947 0.378163
8 -0.887786 -1.980796 -0.347912 0.156349
9 1.230291 1.202380 -0.387327 -0.302303

4. 不要使用工具提示#

工具提示需要 cell_ids 才能工作,并且它们会为 每个 数据单元格生成额外的 HTML 元素。

5. 如果每一字节都很重要,请使用字符串替换#

您可以通过替换默认的 CSS 字典来删除不必要的 HTML,或缩短默认的类名。您可以 below 了解有关 CSS 的更多信息。

[47]:
my_css = {
    "row_heading": "",
    "col_heading": "",
    "index_name": "",
    "col": "c",
    "row": "r",
    "col_trim": "",
    "row_trim": "",
    "level": "l",
    "data": "",
    "blank": "",
}
html = Styler(df4, uuid_len=0, cell_ids=False)
html.set_table_styles([{'selector': 'td', 'props': props},
                       {'selector': '.c1', 'props': 'color:green;'},
                       {'selector': '.l0', 'props': 'color:blue;'}],
                      css_class_names=my_css)
print(html.to_html())
<style type="text/css">
#T_ td {
  font-family: "Times New Roman", Times, serif;
  color: #e83e8c;
  font-size: 1.3em;
}
#T_ .c1 {
  color: green;
}
#T_ .l0 {
  color: blue;
}
</style>
<table id="T_">
  <thead>
    <tr>
      <th class=" l0" >&nbsp;</th>
      <th class=" l0 c0" >0</th>
      <th class=" l0 c1" >1</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th class=" l0 r0" >0</th>
      <td class=" r0 c0" >1</td>
      <td class=" r0 c1" >2</td>
    </tr>
    <tr>
      <th class=" l0 r1" >1</th>
      <td class=" r1 c0" >3</td>
      <td class=" r1 c1" >4</td>
    </tr>
  </tbody>
</table>

[48]:
html
[48]:
  0 1
0 1 2
1 3 4

内置样式#

一些样式函数非常常用,以至于我们已将其“内置”到 Styler 中,因此您无需编写并自行应用它们。当前此类函数的列表包括:

每个函数的独立文档通常会提供有关其参数的更多示例。

高亮显示 Null 值#

[49]:
df2.iloc[0,2] = np.nan
df2.iloc[4,3] = np.nan
df2.loc[:4].style.highlight_null(color='yellow')
[49]:
  A B C D
0 1.764052 0.400157 nan 2.240893
1 1.867558 -0.977278 0.950088 -0.151357
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
4 1.494079 -0.205158 0.313068 nan

高亮显示最小值或最大值#

[50]:
df2.loc[:4].style.highlight_max(axis=1, props='color:white; font-weight:bold; background-color:darkblue;')
[50]:
  A B C D
0 1.764052 0.400157 nan 2.240893
1 1.867558 -0.977278 0.950088 -0.151357
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
4 1.494079 -0.205158 0.313068 nan

高亮显示之间#

此方法接受浮点数形式的范围,或者 NumPy 数组或 Series(前提是索引匹配)。

[51]:
left = pd.Series([1.0, 0.0, 1.0], index=["A", "B", "D"])
df2.loc[:4].style.highlight_between(left=left, right=1.5, axis=1, props='color:white; background-color:purple;')
[51]:
  A B C D
0 1.764052 0.400157 nan 2.240893
1 1.867558 -0.977278 0.950088 -0.151357
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
4 1.494079 -0.205158 0.313068 nan

高亮显示分位数#

用于检测最高或最低百分位数的值

[52]:
df2.loc[:4].style.highlight_quantile(q_left=0.85, axis=None, color='yellow')
[52]:
  A B C D
0 1.764052 0.400157 nan 2.240893
1 1.867558 -0.977278 0.950088 -0.151357
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
4 1.494079 -0.205158 0.313068 nan

背景渐变和文本渐变#

您可以使用 background_gradienttext_gradient 方法创建“热力图”。这些方法需要 matplotlib,我们将使用 Seaborn 来获取一个不错的颜色映射。

[53]:
import seaborn as sns
cm = sns.light_palette("green", as_cmap=True)

df2.style.background_gradient(cmap=cm)
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[53], line 1
----> 1 import seaborn as sns
      2 cm = sns.light_palette("green", as_cmap=True)
      4 df2.style.background_gradient(cmap=cm)

ModuleNotFoundError: No module named 'seaborn'
[54]:
df2.style.text_gradient(cmap=cm)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[54], line 1
----> 1 df2.style.text_gradient(cmap=cm)

NameError: name 'cm' is not defined

.background_gradient.text_gradient 具有多个关键字参数来自定义渐变和颜色。请参阅文档。

设置属性#

当样式实际上不依赖于值时,请使用 Styler.set_properties。这只是 .map 的一个简单包装器,其中函数为所有单元格返回相同的属性。

[55]:
df2.loc[:4].style.set_properties(**{'background-color': 'black',
                           'color': 'lawngreen',
                           'border-color': 'white'})
[55]:
  A B C D
0 1.764052 0.400157 nan 2.240893
1 1.867558 -0.977278 0.950088 -0.151357
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
4 1.494079 -0.205158 0.313068 nan

条形图#

您可以在 DataFrame 中包含“条形图”。

[56]:
df2.style.bar(subset=['A', 'B'], color='#d65f5f')
[56]:
  A B C D
0 1.764052 0.400157 nan 2.240893
1 1.867558 -0.977278 0.950088 -0.151357
2 -0.103219 0.410599 0.144044 1.454274
3 0.761038 0.121675 0.443863 0.333674
4 1.494079 -0.205158 0.313068 nan
5 -2.552990 0.653619 0.864436 -0.742165
6 2.269755 -1.454366 0.045759 -0.187184
7 1.532779 1.469359 0.154947 0.378163
8 -0.887786 -1.980796 -0.347912 0.156349
9 1.230291 1.202380 -0.387327 -0.302303

其他关键字参数可提供对居中和定位的更多控制,您可以传递一个包含 [color_negative, color_positive] 的列表来突出显示较低和较高的值,或者传递一个 matplotlib 颜色映射。

为了展示一个示例,这里是您如何使用新的 align 选项、结合设置 vminvmax 限制、图形的 width 以及单元格的底层 CSS props 来更改上述内容,同时为显示文本和条形图留出空间。我们还使用 text_gradient 来使用 matplotlib 颜色映射将文本颜色设置为与条形图相同(尽管在这种情况下,可视化可能没有这个额外的效果更好)。

[57]:
df2.style.format('{:.3f}', na_rep="")\
         .bar(align=0, vmin=-2.5, vmax=2.5, cmap="bwr", height=50,
              width=60, props="width: 120px; border-right: 1px solid black;")\
         .text_gradient(cmap="bwr", vmin=-2.5, vmax=2.5)
[57]:
  A B C D
0 1.764 0.400 2.241
1 1.868 -0.977 0.950 -0.151
2 -0.103 0.411 0.144 1.454
3 0.761 0.122 0.444 0.334
4 1.494 -0.205 0.313
5 -2.553 0.654 0.864 -0.742
6 2.270 -1.454 0.046 -0.187
7 1.533 1.469 0.155 0.378
8 -0.888 -1.981 -0.348 0.156
9 1.230 1.202 -0.387 -0.302

以下示例旨在重点介绍新对齐选项的行为:

[59]:
HTML(head)
[59]:
Align All Negative Both Neg and Pos All Positive Large Positive
left
-100
-60
-30
-20
-10
-5
0
90
10
20
50
100
100
103
101
102
right
-100
-60
-30
-20
-10
-5
0
90
10
20
50
100
100
103
101
102
zero
-100
-60
-30
-20
-10
-5
0
90
10
20
50
100
100
103
101
102
mid
-100
-60
-30
-20
-10
-5
0
90
10
20
50
100
100
103
101
102
mean
-100
-60
-30
-20
-10
-5
0
90
10
20
50
100
100
103
101
102
99
-100
-60
-30
-20
-10
-5
0
90
10
20
50
100
100
103
101
102

共享样式#

假设您为 DataFrame 构建了一个漂亮的样式,现在您想将相同的样式应用于第二个 DataFrame。使用 df1.style.export 导出样式,并使用 df1.style.set 在第二个 DataFrame 上导入它

[60]:
style1 = df2.style\
            .map(style_negative, props='color:red;')\
            .map(lambda v: 'opacity: 20%;' if (v < 0.3) and (v > -0.3) else None)\
            .set_table_styles([{"selector": "th", "props": "color: blue;"}])\
            .hide(axis="index")
style1
[60]:
A B C D
1.764052 0.400157 nan 2.240893
1.867558 -0.977278 0.950088 -0.151357
-0.103219 0.410599 0.144044 1.454274
0.761038 0.121675 0.443863 0.333674
1.494079 -0.205158 0.313068 nan
-2.552990 0.653619 0.864436 -0.742165
2.269755 -1.454366 0.045759 -0.187184
1.532779 1.469359 0.154947 0.378163
-0.887786 -1.980796 -0.347912 0.156349
1.230291 1.202380 -0.387327 -0.302303
[61]:
style2 = df3.style
style2.use(style1.export())
style2
[61]:
c1 c2 c3 c4
-1.048553 -1.420018 -1.706270 1.950775
-0.509652 -0.438074 -1.252795 0.777490
-1.613898 -0.212740 -0.895467 0.386902
-0.510805 -1.180632 -0.028182 0.428332

请注意,即使样式是数据感知的,您也可以共享它们。样式会在它们已被 use 的新 DataFrame 上重新评估。

限制#

  • 仅限 DataFrame(使用 Series.to_frame().style

  • 索引和列不需要是唯一的,但某些样式函数只能与唯一索引一起使用。

  • 没有大的 repr,并且构造性能不佳;尽管我们有一些 HTML optimizations

  • 您只能应用样式,不能插入新的 HTML 实体,除非通过子类化。

其他有趣且有用的东西#

这里有一些有趣的例子。

小部件#

Styler 与小部件的交互效果很好。如果您是在线查看而不是自己运行笔记本,您将错过交互式调整调色板的机会。

[62]:
from ipywidgets import widgets
@widgets.interact
def f(h_neg=(0, 359, 1), h_pos=(0, 359), s=(0., 99.9), l=(0., 99.9)):
    return df2.style.background_gradient(
        cmap=sns.palettes.diverging_palette(h_neg=h_neg, h_pos=h_pos, s=s, l=l,
                                            as_cmap=True)
    )

放大#

[63]:
def magnify():
    return [dict(selector="th",
                 props=[("font-size", "4pt")]),
            dict(selector="td",
                 props=[('padding', "0em 0em")]),
            dict(selector="th:hover",
                 props=[("font-size", "12pt")]),
            dict(selector="tr:hover td:hover",
                 props=[('max-width', '200px'),
                        ('font-size', '12pt')])
]
[64]:
np.random.seed(25)
cmap = cmap=sns.diverging_palette(5, 250, as_cmap=True)
bigdf = pd.DataFrame(np.random.randn(20, 25)).cumsum()

bigdf.style.background_gradient(cmap, axis=1)\
    .set_properties(**{'max-width': '80px', 'font-size': '1pt'})\
    .set_caption("Hover to magnify")\
    .format(precision=2)\
    .set_table_styles(magnify())
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[64], line 2
      1 np.random.seed(25)
----> 2 cmap = cmap=sns.diverging_palette(5, 250, as_cmap=True)
      3 bigdf = pd.DataFrame(np.random.randn(20, 25)).cumsum()
      5 bigdf.style.background_gradient(cmap, axis=1)\
      6     .set_properties(**{'max-width': '80px', 'font-size': '1pt'})\
      7     .set_caption("Hover to magnify")\
      8     .format(precision=2)\
      9     .set_table_styles(magnify())

NameError: name 'sns' is not defined

固定页眉#

如果您在笔记本中显示大型矩阵或 DataFrame,但希望始终看到列标题和行标题,您可以使用 .set_sticky 方法,该方法会操作表的样式 CSS。

[65]:
bigdf = pd.DataFrame(np.random.randn(16, 100))
bigdf.style.set_sticky(axis="index")
[65]:
  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
0 0.228273 1.026890 -0.839585 -0.591182 -0.956888 -0.222326 -0.619915 1.837905 -2.053231 0.868583 -0.920734 -0.232312 2.152957 -1.334661 0.076380 -1.246089 1.202272 -1.049942 1.056610 -0.419678 2.294842 -2.594487 2.822756 0.680889 -1.577693 -1.976254 0.533340 -0.290870 -0.513520 1.982626 0.226001 -1.839905 1.607671 0.388292 0.399732 0.405477 0.217002 -0.633439 0.246622 -1.939546 0.114060 -1.885341 0.243080 -0.705481 0.364628 -0.502952 -0.225752 -0.565538 0.103395 2.018408 1.094248 1.662434 -0.627453 1.621200 1.178133 -0.374879 -0.544329 0.287761 -0.205820 1.189988 0.728927 -0.222040 -1.622706 0.312541 -1.160421 0.313560 0.471998 0.577862 0.505407 -0.626488 -0.346369 -2.065942 0.768936 1.128866 0.166924 -0.967255 0.491996 -0.550857 -0.084694 1.967568 -0.062675 -0.851136 0.426521 -0.277561 -1.377945 -0.095196 0.833639 -0.784754 1.046145 -0.645784 -1.891579 -0.097333 -1.358895 0.498310 -1.147321 -0.536521 -0.916489 -0.212148 0.192844 -0.322683
1 -1.727654 0.764067 0.445314 -2.135576 1.020364 -0.587397 0.048037 0.560169 1.424193 -0.003191 -0.297766 0.232724 0.671954 -1.346282 -0.601723 -0.169196 -0.658381 -0.196024 0.177552 0.032294 1.303258 -0.539484 0.529918 0.382797 1.800623 2.513618 -0.245011 0.208728 -0.300852 0.152992 0.030979 -0.324954 -0.777273 -0.337442 -2.020510 1.419771 -0.741890 -1.559918 0.966290 -0.182294 2.027541 -1.090301 0.430032 -0.730951 0.164135 -0.673210 -0.168668 -0.541845 -0.352464 1.688785 0.092362 1.121011 -0.451224 0.872053 -1.142141 -0.859672 0.930692 -0.177927 -2.158403 -0.289260 -0.904782 0.487616 -0.041970 0.649388 0.019125 -0.977803 -1.972866 -1.266139 -1.000965 -3.049890 0.394720 -1.947339 0.533330 0.379163 2.040071 0.307235 -0.669187 -0.196576 0.922861 1.727249 -0.775059 1.366756 1.693871 -1.282804 -1.932243 -2.063496 -0.395541 1.925655 -0.503716 -1.558305 1.380012 -2.169335 -1.269709 0.905344 0.737179 -1.260360 1.201543 -0.367450 0.878851 0.844085
2 1.351855 1.115809 -1.030206 -0.444282 0.057423 -0.562746 0.004501 0.173643 0.970628 1.867282 0.119880 0.640622 -2.553511 -0.439966 -0.062954 -0.067075 -0.396659 0.405585 -0.749193 -0.653916 -0.167081 1.410437 0.259248 -0.989426 -1.583010 -0.539820 -0.264962 -1.156517 -0.147415 1.063123 0.549318 1.387270 -0.286247 1.573611 0.962956 0.807019 -0.562733 -0.923400 -0.414296 0.003842 -2.096592 -1.858677 -0.968215 0.456882 -0.110648 1.385829 -1.082738 -1.089539 0.595603 0.081374 1.684345 0.305161 0.590335 -0.177260 0.730379 0.147656 -0.150377 0.243728 -0.263203 -0.378285 0.340001 1.544692 0.579486 1.301523 0.085383 -0.826915 0.680524 -1.034403 -1.110716 0.099092 -2.411402 -0.795409 -0.596730 2.016938 0.650740 -0.205659 -1.367066 1.731274 -0.400586 -1.877268 1.997468 0.610815 0.194705 1.178263 0.110523 0.946986 0.157934 1.319965 1.398984 0.049304 -1.106371 -0.376500 2.061808 -1.546407 0.276935 -0.646731 -0.173810 -0.176011 0.289851 0.024213
3 1.329898 -0.251138 -0.892670 -0.886607 0.023848 -2.151303 0.317010 0.936555 -1.793396 0.407319 1.407526 0.669217 -0.063702 -1.134419 0.643766 0.016192 0.584973 0.572833 0.074078 -0.448167 0.032590 -1.096528 0.745444 1.112199 -0.233729 -0.873415 0.230934 -0.805410 0.216766 0.835699 -0.609935 -2.504445 1.268726 0.276230 -0.600436 -1.180951 -0.294444 1.372700 -1.209484 0.178217 0.739316 -0.013644 -1.148450 2.496847 1.112560 0.085375 0.288464 0.359711 -0.547638 1.113638 1.464883 -0.127626 -0.015008 0.467636 -0.544390 0.020004 0.705605 -2.420518 -0.373968 0.467792 -1.684673 -0.616189 3.774140 0.749130 0.888204 -0.307561 0.895529 -0.503150 -2.521870 1.241118 -0.591644 -0.657826 0.890374 0.238272 0.822878 1.866971 0.985183 -0.096968 -0.677218 -0.310448 -0.061652 0.434656 0.113166 -0.122837 -0.003245 -0.188587 0.474867 0.586855 0.721862 0.983135 -0.208411 0.947936 0.067164 -0.100554 1.066966 0.435700 -1.908924 -0.773551 0.580472 -1.620192
4 -1.567793 -0.972316 1.536337 -1.046018 0.128710 0.780459 0.558835 -0.402247 -1.785758 1.913771 1.390267 -2.093964 1.585005 0.788355 0.088875 0.453289 0.209618 1.461669 0.164643 0.215340 0.647726 -1.852759 -0.514054 -0.528535 -0.978868 1.563941 0.228150 -1.091756 -0.451212 0.538402 -0.064286 -0.278562 1.297073 0.064941 2.050824 -0.517423 0.456448 -0.021227 0.247564 0.869639 1.539611 0.572745 -0.185547 -0.931420 -1.279881 1.396666 0.552607 1.484888 1.193997 -0.236963 0.350956 1.253611 0.686695 -0.394330 0.549364 -0.742711 -0.465343 1.352667 -0.075703 -2.197694 -0.338980 -0.203617 1.701557 -1.170804 0.747205 0.226150 0.725443 0.611623 0.605679 -0.465381 1.056823 2.836512 -0.126174 -0.286708 -0.311325 -1.959020 0.408000 -1.252445 0.044938 0.066002 -0.778297 -0.304053 -1.400471 -0.355749 -1.671326 0.633932 0.804110 -1.034119 -2.847751 -1.121103 0.430543 -0.971643 -0.706059 -0.416779 1.236913 -0.253807 -0.924209 -0.597519 0.414284 -0.450197
5 -0.773866 -0.240521 -0.217165 1.173609 0.686390 0.008358 0.696232 0.173166 0.620498 0.504067 0.428066 -0.051824 0.719915 0.057165 0.562808 -0.369536 0.483399 0.620765 -0.354342 -1.469471 -1.937266 0.038031 -1.518162 -0.417599 0.386717 0.716193 0.489961 0.733957 0.914415 0.679894 0.255448 -0.508338 0.332030 -0.111107 -0.251983 -1.456620 0.409630 1.062320 -0.577115 0.718796 -0.399260 -1.311389 0.649122 0.091566 0.628872 0.297894 -0.142290 -0.542291 -0.914290 1.144514 0.313584 1.182635 1.214235 -0.416446 -1.653940 -2.550787 0.442473 0.052127 -0.464469 -0.523852 0.989726 -1.325539 -0.199687 -1.226727 0.290018 1.164574 0.817841 -0.309509 0.496599 0.943536 -0.091850 -2.802658 2.126219 -0.521161 0.288098 -0.454663 -1.676143 -0.357661 -0.788960 0.185911 -0.017106 2.454020 1.832706 -0.911743 -0.655873 -0.000514 -2.226997 0.677285 -0.140249 -0.408407 -0.838665 0.482228 1.243458 -0.477394 -0.220343 -2.463966 0.237325 -0.307380 1.172478 0.819492
6 0.405906 -0.978919 1.267526 0.145250 -1.066786 -2.114192 -1.128346 -1.082523 0.372216 0.004127 -0.211984 0.937326 -0.935890 -1.704118 0.611789 -1.030015 0.636123 -1.506193 1.736609 1.392958 1.009424 0.353266 0.697339 -0.297424 0.428702 -0.145346 -0.333553 -0.974699 0.665314 0.971944 0.121950 -1.439668 1.018808 1.442399 -0.199585 -1.165916 0.645656 1.436466 -0.921215 1.293906 -2.706443 1.460928 -0.823197 0.292952 -1.448992 0.026692 -0.975883 0.392823 0.442166 0.745741 1.187982 -0.218570 0.305288 0.054932 -1.476953 -0.114434 0.014103 0.825394 -0.060654 -0.413688 0.974836 1.339210 1.034838 0.040775 0.705001 0.017796 1.867681 -0.390173 2.285277 2.311464 -0.085070 -0.648115 0.576300 -0.790087 -1.183798 -1.334558 -0.454118 0.319302 1.706488 0.830429 0.502476 -0.079631 0.414635 0.332511 0.042935 -0.160910 0.918553 -0.292697 -1.303834 -0.199604 0.871023 -1.370681 -0.205701 -0.492973 1.123083 -0.081842 -0.118527 0.245838 -0.315742 -0.511806
7 0.011470 -0.036104 1.399603 -0.418176 -0.412229 -1.234783 -1.121500 1.196478 -0.569522 0.422022 -0.220484 0.804338 2.892667 -0.511055 -0.168722 -1.477996 -1.969917 0.471354 1.698548 0.137105 -0.762052 0.199379 -0.964346 -0.256692 1.265275 0.848762 -0.784161 1.863776 -0.355569 0.854552 0.768061 -2.075718 -2.501069 1.109868 0.957545 -0.683276 0.307764 0.733073 1.706250 -1.118091 0.374961 -1.414503 -0.524183 -1.662696 0.687921 0.521732 1.451396 -0.833491 -0.362796 -1.174444 -0.813893 -0.893220 0.770743 1.156647 -0.647444 0.125929 0.513600 -0.537874 1.992052 -1.946584 -0.104759 0.484779 -0.290936 -0.441075 0.542993 -1.050038 1.630482 0.239771 -1.177310 0.464804 -0.966995 0.646086 0.486899 1.022196 -2.267827 -1.229616 1.313805 1.073292 2.324940 -0.542720 -1.504292 0.777643 -0.618553 0.011342 1.385062 1.363552 -0.549834 0.688896 1.361288 -0.381137 0.797812 -1.128198 0.369208 0.540132 0.413853 -0.200308 -0.969126 0.981293 -0.009783 -0.320020
8 -0.574816 1.419977 0.434813 -1.101217 -1.586275 1.979573 0.378298 0.782326 2.178987 0.657564 0.683774 -0.091000 -0.059552 -0.738908 -0.907653 -0.701936 0.580039 -0.618757 0.453684 1.665382 -0.152321 0.880077 0.571073 -0.604736 0.532359 0.515031 -0.959844 -0.887184 0.435781 0.862093 -0.956321 -0.625909 0.194472 0.442490 0.526503 -0.215274 0.090711 0.932592 0.811999 -2.497026 0.631545 0.321418 -0.425549 -1.078832 0.753444 0.199790 -0.360526 -0.013448 -0.819476 0.814869 0.442118 -0.972048 -0.060603 -2.349825 1.265445 -0.573257 0.429124 1.049783 1.954773 0.071883 -0.094209 0.265616 0.948318 0.331645 1.343401 -0.167934 -1.105252 -0.167077 -0.096576 -0.838161 -0.208564 0.394534 0.762533 1.235357 -0.207282 -0.202946 -0.468025 0.256944 2.587584 1.186697 -1.031903 1.428316 0.658899 -0.046582 -0.075422 1.329359 -0.684267 -1.524182 2.014061 3.770933 0.647353 -1.021377 -0.345493 0.582811 0.797812 1.326020 1.422857 -3.077007 0.184083 1.478935
9 -0.600142 1.929561 -2.346771 -0.669700 -1.165258 0.814788 0.444449 -0.576758 0.353091 0.408893 0.091391 -2.294389 0.485506 -0.081304 -0.716272 -1.648010 1.005361 -1.489603 0.363098 0.758602 -1.373847 -0.972057 1.988537 0.319829 1.169060 0.146585 1.030388 1.165984 1.369563 0.730984 -1.383696 -0.515189 -0.808927 -1.174651 -1.631502 -1.123414 -0.478155 -1.583067 1.419074 1.668777 1.567517 0.222103 -0.336040 -1.352064 0.251032 -0.401695 0.268413 -0.012299 -0.918953 2.921208 -0.581588 0.672848 1.251136 1.382263 1.429897 1.290990 -1.272673 -0.308611 -0.422988 -0.675642 0.874441 1.305736 -0.262585 -1.099395 -0.667101 -0.646737 -0.556338 -0.196591 0.119306 -0.266455 -0.524267 2.650951 0.097318 -0.974697 0.189964 1.141155 -0.064434 1.104971 -1.508908 -0.031833 0.803919 -0.659221 0.939145 0.214041 -0.531805 0.956060 0.249328 0.637903 -0.510158 1.850287 -0.348407 2.001376 -0.389643 -0.024786 -0.470973 0.869339 0.170667 0.598062 1.217262 1.274013
10 -0.389981 -0.752441 -0.734871 3.517318 -1.173559 -0.004956 0.145419 2.151368 -3.086037 -1.569139 1.449784 -0.868951 -1.687716 -0.994401 1.153266 1.803045 -0.819059 0.847970 0.227102 -0.500762 0.868210 1.823540 1.161007 -0.307606 -0.713416 0.363560 -0.822162 2.427681 -0.129537 -0.078716 1.345644 -1.286094 0.237242 -0.136056 0.596664 -1.412381 1.206341 0.299860 0.705238 0.142412 -1.059382 0.833468 1.060015 -0.527045 -1.135732 -1.140983 -0.779540 -0.640875 -1.217196 -1.675663 0.241263 -0.273322 -1.697936 -0.594943 0.101154 1.391735 -0.426953 1.008344 -0.818577 1.924570 -0.578900 -0.457395 -1.096705 0.418522 -0.155623 0.169706 -2.533706 0.018904 1.434160 0.744095 0.647626 -0.770309 2.329141 -0.141547 -1.761594 0.702091 -1.531450 -0.788427 -0.184622 -1.942321 1.530113 0.503406 1.105845 -0.935120 -1.115483 -2.249762 1.307135 0.788412 -0.441091 0.073561 0.812101 -0.916146 1.573714 -0.309508 0.499987 0.187594 0.558913 0.903246 0.317901 -0.809797
11 1.128248 1.516826 -0.186735 -0.668157 1.132259 -0.246648 -0.855167 0.732283 0.931802 1.318684 -1.198418 -1.149318 0.586321 -1.171937 -0.607731 2.753747 1.479287 -1.136365 -0.020485 0.320444 -1.955755 0.660402 -1.545371 0.200519 -0.017263 1.634686 0.599246 0.462989 0.023721 0.225546 0.170972 -0.027496 -0.061233 -0.566411 -0.669567 0.601618 0.503656 -0.678253 -2.907108 -1.717123 0.397631 1.300108 0.215821 -0.593075 -0.225944 -0.946057 1.000308 0.393160 1.342074 -0.370687 -0.166413 -0.419814 -0.255931 1.789478 0.282378 0.742260 -0.050498 1.415309 0.838166 -1.400292 -0.937976 -1.499148 0.801859 0.224824 0.283572 0.643703 -1.198465 0.527206 0.215202 0.437048 1.312868 0.741243 0.077988 0.006123 0.190370 0.018007 -1.026036 -2.378430 -1.069949 0.843822 1.289216 -1.423369 -0.462887 0.197330 -0.935076 0.441271 0.414643 -0.377887 -0.530515 0.621592 1.009572 0.569718 0.175291 -0.656279 -0.112273 -0.392137 -1.043558 -0.467318 -0.384329 -2.009207
12 0.658598 0.101830 -0.682781 0.229349 -0.305657 0.404877 0.252244 -0.837784 -0.039624 0.329457 0.751694 1.469070 -0.157199 1.032628 -0.584639 -0.925544 0.342474 -0.969363 0.133480 -0.385974 -0.600278 0.281939 0.868579 1.129803 -0.041898 0.961193 0.131521 -0.792889 -1.285737 0.073934 -1.333315 -1.044125 1.277338 1.492257 0.411379 1.771805 -1.111128 1.123233 -1.019449 1.738357 -0.690764 -0.120710 -0.421359 -0.727294 -0.857759 -0.069436 -0.328334 -0.558180 1.063474 -0.519133 -0.496902 1.089589 -1.615801 0.080174 -0.229938 -0.498420 -0.624615 0.059481 -0.093158 -1.784549 -0.503789 -0.140528 0.002653 -0.484930 0.055914 -0.680948 -0.994271 1.277052 0.037651 2.155421 -0.437589 0.696404 0.417752 -0.544785 1.190690 0.978262 0.752102 0.504472 0.139853 -0.505089 -0.264975 -1.603194 0.731847 0.010903 -1.165346 -0.125195 -1.032685 -0.465520 1.514808 0.304762 0.793414 0.314635 -1.638279 0.111737 -0.777037 0.251783 1.126303 -0.808798 0.422064 -0.349264
13 -0.356362 -0.089227 0.609373 0.542382 -0.768681 -0.048074 2.015458 -1.552351 0.251552 1.459635 0.949707 0.339465 -0.001372 1.798589 1.559163 0.231783 0.423141 -0.310530 0.353795 2.173336 -0.196247 -0.375636 -0.858221 0.258410 0.656430 0.960819 1.137893 1.553405 0.038981 -0.632038 -0.132009 -1.834997 -0.242576 -0.297879 -0.441559 -0.769691 0.224077 -0.153009 0.519526 -0.680188 0.535851 0.671496 -0.183064 0.301234 1.288256 -2.478240 -0.360403 0.424067 -0.834659 -0.128464 -0.489013 -0.014888 -1.461230 -1.435223 -1.319802 1.083675 0.979140 -0.375291 1.110189 -1.011351 0.587886 -0.822775 -1.183865 1.455173 1.134328 0.239403 -0.837991 -1.130932 0.783168 1.845520 1.437072 -1.198443 1.379098 2.129113 0.260096 -0.011975 0.043302 0.722941 1.028152 -0.235806 1.145245 -1.359598 0.232189 0.503712 -0.614264 -0.530606 -2.435803 -0.255238 -0.064423 0.784643 0.256346 0.128023 1.414103 -1.118659 0.877353 0.500561 0.463651 -2.034512 -0.981683 -0.691944
14 -1.113376 -1.169402 0.680539 -1.534212 1.653817 -1.295181 -0.566826 0.477014 1.413371 0.517105 1.401153 -0.872685 0.830957 0.181507 -0.145616 0.694592 -0.751208 0.324444 0.681973 -0.054972 0.917776 -1.024810 -0.206446 -0.600113 0.852805 1.455109 -0.079769 0.076076 0.207699 -1.850458 -0.124124 -0.610871 -0.883362 0.219049 -0.685094 -0.645330 -0.242805 -0.775602 0.233070 2.422642 -1.423040 -0.582421 0.968304 -0.701025 -0.167850 0.277264 1.301231 0.301205 -3.081249 -0.562868 0.192944 -0.664592 0.565686 0.190913 -0.841858 -1.856545 -1.022777 1.295968 0.451921 0.659955 0.065818 -0.319586 0.253495 -1.144646 -0.483404 0.555902 0.807069 0.714196 0.661196 0.053667 0.346833 -1.288977 -0.386734 -1.262127 0.477495 -0.494034 -0.911414 1.152963 -0.342365 -0.160187 0.470054 -0.853063 -1.387949 -0.257257 -1.030690 -0.110210 0.328911 -0.555923 0.987713 -0.501957 2.069887 -0.067503 0.316029 -1.506232 2.201621 0.492097 -0.085193 -0.977822 1.039147 -0.653932
15 -0.405638 -1.402027 -1.166242 1.306184 0.856283 -1.236170 -0.646721 -1.474064 0.082960 0.090310 -0.169977 0.406345 0.915427 -0.974503 0.271637 1.539184 -0.098866 -0.525149 1.063933 0.085827 -0.129622 0.947959 -0.072496 -0.237592 0.012549 1.065761 0.996596 -0.172481 2.583139 -0.028578 -0.254856 1.328794 -1.592951 2.434350 -0.341500 -0.307719 -1.333273 -1.100845 0.209097 1.734777 0.639632 0.424779 -0.129327 0.905029 -0.482909 1.731628 -2.783425 -0.333677 -0.110895 1.212636 -0.208412 0.427117 1.348563 0.043859 1.772519 -1.416106 0.401155 0.807157 0.303427 -1.246288 0.178774 -0.066126 -1.862288 1.241295 0.377021 -0.822320 -0.749014 1.463652 1.602268 -1.043877 1.185290 -0.565783 -1.076879 1.360241 -0.121991 0.991043 1.007952 0.450185 -0.744376 1.388876 -0.316847 -0.841655 -1.056842 -0.500226 0.096959 1.176896 -2.939652 1.792213 0.316340 0.303218 1.024967 -0.590871 -0.453326 -0.795981 -0.393301 -0.374372 -1.270199 1.618372 1.197727 -0.914863

也可以固定 MultiIndexes 甚至只固定特定级别。

[66]:
bigdf.index = pd.MultiIndex.from_product([["A","B"],[0,1],[0,1,2,3]])
bigdf.style.set_sticky(axis="index", pixel_size=18, levels=[1,2])
[66]:
      0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
A 0 0 0.228273 1.026890 -0.839585 -0.591182 -0.956888 -0.222326 -0.619915 1.837905 -2.053231 0.868583 -0.920734 -0.232312 2.152957 -1.334661 0.076380 -1.246089 1.202272 -1.049942 1.056610 -0.419678 2.294842 -2.594487 2.822756 0.680889 -1.577693 -1.976254 0.533340 -0.290870 -0.513520 1.982626 0.226001 -1.839905 1.607671 0.388292 0.399732 0.405477 0.217002 -0.633439 0.246622 -1.939546 0.114060 -1.885341 0.243080 -0.705481 0.364628 -0.502952 -0.225752 -0.565538 0.103395 2.018408 1.094248 1.662434 -0.627453 1.621200 1.178133 -0.374879 -0.544329 0.287761 -0.205820 1.189988 0.728927 -0.222040 -1.622706 0.312541 -1.160421 0.313560 0.471998 0.577862 0.505407 -0.626488 -0.346369 -2.065942 0.768936 1.128866 0.166924 -0.967255 0.491996 -0.550857 -0.084694 1.967568 -0.062675 -0.851136 0.426521 -0.277561 -1.377945 -0.095196 0.833639 -0.784754 1.046145 -0.645784 -1.891579 -0.097333 -1.358895 0.498310 -1.147321 -0.536521 -0.916489 -0.212148 0.192844 -0.322683
1 -1.727654 0.764067 0.445314 -2.135576 1.020364 -0.587397 0.048037 0.560169 1.424193 -0.003191 -0.297766 0.232724 0.671954 -1.346282 -0.601723 -0.169196 -0.658381 -0.196024 0.177552 0.032294 1.303258 -0.539484 0.529918 0.382797 1.800623 2.513618 -0.245011 0.208728 -0.300852 0.152992 0.030979 -0.324954 -0.777273 -0.337442 -2.020510 1.419771 -0.741890 -1.559918 0.966290 -0.182294 2.027541 -1.090301 0.430032 -0.730951 0.164135 -0.673210 -0.168668 -0.541845 -0.352464 1.688785 0.092362 1.121011 -0.451224 0.872053 -1.142141 -0.859672 0.930692 -0.177927 -2.158403 -0.289260 -0.904782 0.487616 -0.041970 0.649388 0.019125 -0.977803 -1.972866 -1.266139 -1.000965 -3.049890 0.394720 -1.947339 0.533330 0.379163 2.040071 0.307235 -0.669187 -0.196576 0.922861 1.727249 -0.775059 1.366756 1.693871 -1.282804 -1.932243 -2.063496 -0.395541 1.925655 -0.503716 -1.558305 1.380012 -2.169335 -1.269709 0.905344 0.737179 -1.260360 1.201543 -0.367450 0.878851 0.844085
2 1.351855 1.115809 -1.030206 -0.444282 0.057423 -0.562746 0.004501 0.173643 0.970628 1.867282 0.119880 0.640622 -2.553511 -0.439966 -0.062954 -0.067075 -0.396659 0.405585 -0.749193 -0.653916 -0.167081 1.410437 0.259248 -0.989426 -1.583010 -0.539820 -0.264962 -1.156517 -0.147415 1.063123 0.549318 1.387270 -0.286247 1.573611 0.962956 0.807019 -0.562733 -0.923400 -0.414296 0.003842 -2.096592 -1.858677 -0.968215 0.456882 -0.110648 1.385829 -1.082738 -1.089539 0.595603 0.081374 1.684345 0.305161 0.590335 -0.177260 0.730379 0.147656 -0.150377 0.243728 -0.263203 -0.378285 0.340001 1.544692 0.579486 1.301523 0.085383 -0.826915 0.680524 -1.034403 -1.110716 0.099092 -2.411402 -0.795409 -0.596730 2.016938 0.650740 -0.205659 -1.367066 1.731274 -0.400586 -1.877268 1.997468 0.610815 0.194705 1.178263 0.110523 0.946986 0.157934 1.319965 1.398984 0.049304 -1.106371 -0.376500 2.061808 -1.546407 0.276935 -0.646731 -0.173810 -0.176011 0.289851 0.024213
3 1.329898 -0.251138 -0.892670 -0.886607 0.023848 -2.151303 0.317010 0.936555 -1.793396 0.407319 1.407526 0.669217 -0.063702 -1.134419 0.643766 0.016192 0.584973 0.572833 0.074078 -0.448167 0.032590 -1.096528 0.745444 1.112199 -0.233729 -0.873415 0.230934 -0.805410 0.216766 0.835699 -0.609935 -2.504445 1.268726 0.276230 -0.600436 -1.180951 -0.294444 1.372700 -1.209484 0.178217 0.739316 -0.013644 -1.148450 2.496847 1.112560 0.085375 0.288464 0.359711 -0.547638 1.113638 1.464883 -0.127626 -0.015008 0.467636 -0.544390 0.020004 0.705605 -2.420518 -0.373968 0.467792 -1.684673 -0.616189 3.774140 0.749130 0.888204 -0.307561 0.895529 -0.503150 -2.521870 1.241118 -0.591644 -0.657826 0.890374 0.238272 0.822878 1.866971 0.985183 -0.096968 -0.677218 -0.310448 -0.061652 0.434656 0.113166 -0.122837 -0.003245 -0.188587 0.474867 0.586855 0.721862 0.983135 -0.208411 0.947936 0.067164 -0.100554 1.066966 0.435700 -1.908924 -0.773551 0.580472 -1.620192
1 0 -1.567793 -0.972316 1.536337 -1.046018 0.128710 0.780459 0.558835 -0.402247 -1.785758 1.913771 1.390267 -2.093964 1.585005 0.788355 0.088875 0.453289 0.209618 1.461669 0.164643 0.215340 0.647726 -1.852759 -0.514054 -0.528535 -0.978868 1.563941 0.228150 -1.091756 -0.451212 0.538402 -0.064286 -0.278562 1.297073 0.064941 2.050824 -0.517423 0.456448 -0.021227 0.247564 0.869639 1.539611 0.572745 -0.185547 -0.931420 -1.279881 1.396666 0.552607 1.484888 1.193997 -0.236963 0.350956 1.253611 0.686695 -0.394330 0.549364 -0.742711 -0.465343 1.352667 -0.075703 -2.197694 -0.338980 -0.203617 1.701557 -1.170804 0.747205 0.226150 0.725443 0.611623 0.605679 -0.465381 1.056823 2.836512 -0.126174 -0.286708 -0.311325 -1.959020 0.408000 -1.252445 0.044938 0.066002 -0.778297 -0.304053 -1.400471 -0.355749 -1.671326 0.633932 0.804110 -1.034119 -2.847751 -1.121103 0.430543 -0.971643 -0.706059 -0.416779 1.236913 -0.253807 -0.924209 -0.597519 0.414284 -0.450197
1 -0.773866 -0.240521 -0.217165 1.173609 0.686390 0.008358 0.696232 0.173166 0.620498 0.504067 0.428066 -0.051824 0.719915 0.057165 0.562808 -0.369536 0.483399 0.620765 -0.354342 -1.469471 -1.937266 0.038031 -1.518162 -0.417599 0.386717 0.716193 0.489961 0.733957 0.914415 0.679894 0.255448 -0.508338 0.332030 -0.111107 -0.251983 -1.456620 0.409630 1.062320 -0.577115 0.718796 -0.399260 -1.311389 0.649122 0.091566 0.628872 0.297894 -0.142290 -0.542291 -0.914290 1.144514 0.313584 1.182635 1.214235 -0.416446 -1.653940 -2.550787 0.442473 0.052127 -0.464469 -0.523852 0.989726 -1.325539 -0.199687 -1.226727 0.290018 1.164574 0.817841 -0.309509 0.496599 0.943536 -0.091850 -2.802658 2.126219 -0.521161 0.288098 -0.454663 -1.676143 -0.357661 -0.788960 0.185911 -0.017106 2.454020 1.832706 -0.911743 -0.655873 -0.000514 -2.226997 0.677285 -0.140249 -0.408407 -0.838665 0.482228 1.243458 -0.477394 -0.220343 -2.463966 0.237325 -0.307380 1.172478 0.819492
2 0.405906 -0.978919 1.267526 0.145250 -1.066786 -2.114192 -1.128346 -1.082523 0.372216 0.004127 -0.211984 0.937326 -0.935890 -1.704118 0.611789 -1.030015 0.636123 -1.506193 1.736609 1.392958 1.009424 0.353266 0.697339 -0.297424 0.428702 -0.145346 -0.333553 -0.974699 0.665314 0.971944 0.121950 -1.439668 1.018808 1.442399 -0.199585 -1.165916 0.645656 1.436466 -0.921215 1.293906 -2.706443 1.460928 -0.823197 0.292952 -1.448992 0.026692 -0.975883 0.392823 0.442166 0.745741 1.187982 -0.218570 0.305288 0.054932 -1.476953 -0.114434 0.014103 0.825394 -0.060654 -0.413688 0.974836 1.339210 1.034838 0.040775 0.705001 0.017796 1.867681 -0.390173 2.285277 2.311464 -0.085070 -0.648115 0.576300 -0.790087 -1.183798 -1.334558 -0.454118 0.319302 1.706488 0.830429 0.502476 -0.079631 0.414635 0.332511 0.042935 -0.160910 0.918553 -0.292697 -1.303834 -0.199604 0.871023 -1.370681 -0.205701 -0.492973 1.123083 -0.081842 -0.118527 0.245838 -0.315742 -0.511806
3 0.011470 -0.036104 1.399603 -0.418176 -0.412229 -1.234783 -1.121500 1.196478 -0.569522 0.422022 -0.220484 0.804338 2.892667 -0.511055 -0.168722 -1.477996 -1.969917 0.471354 1.698548 0.137105 -0.762052 0.199379 -0.964346 -0.256692 1.265275 0.848762 -0.784161 1.863776 -0.355569 0.854552 0.768061 -2.075718 -2.501069 1.109868 0.957545 -0.683276 0.307764 0.733073 1.706250 -1.118091 0.374961 -1.414503 -0.524183 -1.662696 0.687921 0.521732 1.451396 -0.833491 -0.362796 -1.174444 -0.813893 -0.893220 0.770743 1.156647 -0.647444 0.125929 0.513600 -0.537874 1.992052 -1.946584 -0.104759 0.484779 -0.290936 -0.441075 0.542993 -1.050038 1.630482 0.239771 -1.177310 0.464804 -0.966995 0.646086 0.486899 1.022196 -2.267827 -1.229616 1.313805 1.073292 2.324940 -0.542720 -1.504292 0.777643 -0.618553 0.011342 1.385062 1.363552 -0.549834 0.688896 1.361288 -0.381137 0.797812 -1.128198 0.369208 0.540132 0.413853 -0.200308 -0.969126 0.981293 -0.009783 -0.320020
B 0 0 -0.574816 1.419977 0.434813 -1.101217 -1.586275 1.979573 0.378298 0.782326 2.178987 0.657564 0.683774 -0.091000 -0.059552 -0.738908 -0.907653 -0.701936 0.580039 -0.618757 0.453684 1.665382 -0.152321 0.880077 0.571073 -0.604736 0.532359 0.515031 -0.959844 -0.887184 0.435781 0.862093 -0.956321 -0.625909 0.194472 0.442490 0.526503 -0.215274 0.090711 0.932592 0.811999 -2.497026 0.631545 0.321418 -0.425549 -1.078832 0.753444 0.199790 -0.360526 -0.013448 -0.819476 0.814869 0.442118 -0.972048 -0.060603 -2.349825 1.265445 -0.573257 0.429124 1.049783 1.954773 0.071883 -0.094209 0.265616 0.948318 0.331645 1.343401 -0.167934 -1.105252 -0.167077 -0.096576 -0.838161 -0.208564 0.394534 0.762533 1.235357 -0.207282 -0.202946 -0.468025 0.256944 2.587584 1.186697 -1.031903 1.428316 0.658899 -0.046582 -0.075422 1.329359 -0.684267 -1.524182 2.014061 3.770933 0.647353 -1.021377 -0.345493 0.582811 0.797812 1.326020 1.422857 -3.077007 0.184083 1.478935
1 -0.600142 1.929561 -2.346771 -0.669700 -1.165258 0.814788 0.444449 -0.576758 0.353091 0.408893 0.091391 -2.294389 0.485506 -0.081304 -0.716272 -1.648010 1.005361 -1.489603 0.363098 0.758602 -1.373847 -0.972057 1.988537 0.319829 1.169060 0.146585 1.030388 1.165984 1.369563 0.730984 -1.383696 -0.515189 -0.808927 -1.174651 -1.631502 -1.123414 -0.478155 -1.583067 1.419074 1.668777 1.567517 0.222103 -0.336040 -1.352064 0.251032 -0.401695 0.268413 -0.012299 -0.918953 2.921208 -0.581588 0.672848 1.251136 1.382263 1.429897 1.290990 -1.272673 -0.308611 -0.422988 -0.675642 0.874441 1.305736 -0.262585 -1.099395 -0.667101 -0.646737 -0.556338 -0.196591 0.119306 -0.266455 -0.524267 2.650951 0.097318 -0.974697 0.189964 1.141155 -0.064434 1.104971 -1.508908 -0.031833 0.803919 -0.659221 0.939145 0.214041 -0.531805 0.956060 0.249328 0.637903 -0.510158 1.850287 -0.348407 2.001376 -0.389643 -0.024786 -0.470973 0.869339 0.170667 0.598062 1.217262 1.274013
2 -0.389981 -0.752441 -0.734871 3.517318 -1.173559 -0.004956 0.145419 2.151368 -3.086037 -1.569139 1.449784 -0.868951 -1.687716 -0.994401 1.153266 1.803045 -0.819059 0.847970 0.227102 -0.500762 0.868210 1.823540 1.161007 -0.307606 -0.713416 0.363560 -0.822162 2.427681 -0.129537 -0.078716 1.345644 -1.286094 0.237242 -0.136056 0.596664 -1.412381 1.206341 0.299860 0.705238 0.142412 -1.059382 0.833468 1.060015 -0.527045 -1.135732 -1.140983 -0.779540 -0.640875 -1.217196 -1.675663 0.241263 -0.273322 -1.697936 -0.594943 0.101154 1.391735 -0.426953 1.008344 -0.818577 1.924570 -0.578900 -0.457395 -1.096705 0.418522 -0.155623 0.169706 -2.533706 0.018904 1.434160 0.744095 0.647626 -0.770309 2.329141 -0.141547 -1.761594 0.702091 -1.531450 -0.788427 -0.184622 -1.942321 1.530113 0.503406 1.105845 -0.935120 -1.115483 -2.249762 1.307135 0.788412 -0.441091 0.073561 0.812101 -0.916146 1.573714 -0.309508 0.499987 0.187594 0.558913 0.903246 0.317901 -0.809797
3 1.128248 1.516826 -0.186735 -0.668157 1.132259 -0.246648 -0.855167 0.732283 0.931802 1.318684 -1.198418 -1.149318 0.586321 -1.171937 -0.607731 2.753747 1.479287 -1.136365 -0.020485 0.320444 -1.955755 0.660402 -1.545371 0.200519 -0.017263 1.634686 0.599246 0.462989 0.023721 0.225546 0.170972 -0.027496 -0.061233 -0.566411 -0.669567 0.601618 0.503656 -0.678253 -2.907108 -1.717123 0.397631 1.300108 0.215821 -0.593075 -0.225944 -0.946057 1.000308 0.393160 1.342074 -0.370687 -0.166413 -0.419814 -0.255931 1.789478 0.282378 0.742260 -0.050498 1.415309 0.838166 -1.400292 -0.937976 -1.499148 0.801859 0.224824 0.283572 0.643703 -1.198465 0.527206 0.215202 0.437048 1.312868 0.741243 0.077988 0.006123 0.190370 0.018007 -1.026036 -2.378430 -1.069949 0.843822 1.289216 -1.423369 -0.462887 0.197330 -0.935076 0.441271 0.414643 -0.377887 -0.530515 0.621592 1.009572 0.569718 0.175291 -0.656279 -0.112273 -0.392137 -1.043558 -0.467318 -0.384329 -2.009207
1 0 0.658598 0.101830 -0.682781 0.229349 -0.305657 0.404877 0.252244 -0.837784 -0.039624 0.329457 0.751694 1.469070 -0.157199 1.032628 -0.584639 -0.925544 0.342474 -0.969363 0.133480 -0.385974 -0.600278 0.281939 0.868579 1.129803 -0.041898 0.961193 0.131521 -0.792889 -1.285737 0.073934 -1.333315 -1.044125 1.277338 1.492257 0.411379 1.771805 -1.111128 1.123233 -1.019449 1.738357 -0.690764 -0.120710 -0.421359 -0.727294 -0.857759 -0.069436 -0.328334 -0.558180 1.063474 -0.519133 -0.496902 1.089589 -1.615801 0.080174 -0.229938 -0.498420 -0.624615 0.059481 -0.093158 -1.784549 -0.503789 -0.140528 0.002653 -0.484930 0.055914 -0.680948 -0.994271 1.277052 0.037651 2.155421 -0.437589 0.696404 0.417752 -0.544785 1.190690 0.978262 0.752102 0.504472 0.139853 -0.505089 -0.264975 -1.603194 0.731847 0.010903 -1.165346 -0.125195 -1.032685 -0.465520 1.514808 0.304762 0.793414 0.314635 -1.638279 0.111737 -0.777037 0.251783 1.126303 -0.808798 0.422064 -0.349264
1 -0.356362 -0.089227 0.609373 0.542382 -0.768681 -0.048074 2.015458 -1.552351 0.251552 1.459635 0.949707 0.339465 -0.001372 1.798589 1.559163 0.231783 0.423141 -0.310530 0.353795 2.173336 -0.196247 -0.375636 -0.858221 0.258410 0.656430 0.960819 1.137893 1.553405 0.038981 -0.632038 -0.132009 -1.834997 -0.242576 -0.297879 -0.441559 -0.769691 0.224077 -0.153009 0.519526 -0.680188 0.535851 0.671496 -0.183064 0.301234 1.288256 -2.478240 -0.360403 0.424067 -0.834659 -0.128464 -0.489013 -0.014888 -1.461230 -1.435223 -1.319802 1.083675 0.979140 -0.375291 1.110189 -1.011351 0.587886 -0.822775 -1.183865 1.455173 1.134328 0.239403 -0.837991 -1.130932 0.783168 1.845520 1.437072 -1.198443 1.379098 2.129113 0.260096 -0.011975 0.043302 0.722941 1.028152 -0.235806 1.145245 -1.359598 0.232189 0.503712 -0.614264 -0.530606 -2.435803 -0.255238 -0.064423 0.784643 0.256346 0.128023 1.414103 -1.118659 0.877353 0.500561 0.463651 -2.034512 -0.981683 -0.691944
2 -1.113376 -1.169402 0.680539 -1.534212 1.653817 -1.295181 -0.566826 0.477014 1.413371 0.517105 1.401153 -0.872685 0.830957 0.181507 -0.145616 0.694592 -0.751208 0.324444 0.681973 -0.054972 0.917776 -1.024810 -0.206446 -0.600113 0.852805 1.455109 -0.079769 0.076076 0.207699 -1.850458 -0.124124 -0.610871 -0.883362 0.219049 -0.685094 -0.645330 -0.242805 -0.775602 0.233070 2.422642 -1.423040 -0.582421 0.968304 -0.701025 -0.167850 0.277264 1.301231 0.301205 -3.081249 -0.562868 0.192944 -0.664592 0.565686 0.190913 -0.841858 -1.856545 -1.022777 1.295968 0.451921 0.659955 0.065818 -0.319586 0.253495 -1.144646 -0.483404 0.555902 0.807069 0.714196 0.661196 0.053667 0.346833 -1.288977 -0.386734 -1.262127 0.477495 -0.494034 -0.911414 1.152963 -0.342365 -0.160187 0.470054 -0.853063 -1.387949 -0.257257 -1.030690 -0.110210 0.328911 -0.555923 0.987713 -0.501957 2.069887 -0.067503 0.316029 -1.506232 2.201621 0.492097 -0.085193 -0.977822 1.039147 -0.653932
3 -0.405638 -1.402027 -1.166242 1.306184 0.856283 -1.236170 -0.646721 -1.474064 0.082960 0.090310 -0.169977 0.406345 0.915427 -0.974503 0.271637 1.539184 -0.098866 -0.525149 1.063933 0.085827 -0.129622 0.947959 -0.072496 -0.237592 0.012549 1.065761 0.996596 -0.172481 2.583139 -0.028578 -0.254856 1.328794 -1.592951 2.434350 -0.341500 -0.307719 -1.333273 -1.100845 0.209097 1.734777 0.639632 0.424779 -0.129327 0.905029 -0.482909 1.731628 -2.783425 -0.333677 -0.110895 1.212636 -0.208412 0.427117 1.348563 0.043859 1.772519 -1.416106 0.401155 0.807157 0.303427 -1.246288 0.178774 -0.066126 -1.862288 1.241295 0.377021 -0.822320 -0.749014 1.463652 1.602268 -1.043877 1.185290 -0.565783 -1.076879 1.360241 -0.121991 0.991043 1.007952 0.450185 -0.744376 1.388876 -0.316847 -0.841655 -1.056842 -0.500226 0.096959 1.176896 -2.939652 1.792213 0.316340 0.303218 1.024967 -0.590871 -0.453326 -0.795981 -0.393301 -0.374372 -1.270199 1.618372 1.197727 -0.914863

HTML 转义#

假设您需要在 HTML 中显示 HTML,当渲染器无法区分时,这可能会有些麻烦。您可以使用 escape 格式化选项来处理此问题,甚至可以在包含 HTML 本身的格式器中使用它。

[67]:
df4 = pd.DataFrame([['<div></div>', '"&other"', '<span></span>']])
df4.style
[67]:
  0 1 2
0
"&other"
[68]:
df4.style.format(escape="html")
[68]:
  0 1 2
0 <div></div> "&other" <span></span>
[69]:
df4.style.format('<a href="https://pandas.pydata.org" target="_blank">{}</a>', escape="html")

导出到 Excel#

使用 OpenPyXLXlsxWriter 引擎导出样式化的 DataFrames 到 Excel 工作表有一些支持(自 0.20.0 版本起)。处理的 CSS2.2 属性包括:

  • background-color

  • border-style 属性

  • border-width 属性

  • border-color 属性

  • color

  • font-family

  • font-style

  • font-weight

  • text-align

  • text-decoration

  • vertical-align

  • white-space: nowrap

  • 支持简写和边特定边框属性(例如 border-styleborder-left-style)以及所有边框的 border 简写(border: 1px solid green)或指定边的(border-left: 1px solid green)。使用 border 简写将覆盖之前设置的任何边框属性(有关更多详细信息,请参阅 CSS Working Group )。

  • 目前仅支持 CSS2 命名颜色和 #rgb#rrggbb 形式的十六进制颜色。

  • 以下伪 CSS 属性也可用于设置 Excel 特定样式属性:

    • number-format

    • ``border-style``(用于 Excel 特定样式:“hair”、“mediumDashDot”、“dashDotDot”、“mediumDashDotDot”、“dashDot”、“slantDashDot” 或 “mediumDashed”)

表级别样式和数据单元格 CSS 类不包含在导出到 Excel 的内容中:必须通过 Styler.apply 和/或 Styler.map 方法将单个单元格的属性映射。

[70]:
df2.style.\
    map(style_negative, props='color:red;').\
    highlight_max(axis=0).\
    to_excel('styled.xlsx', engine='openpyxl')

输出的截图:

带有样式化 DataFrame 的 Excel 电子表格

导出到 LaTeX#

支持(自 1.3.0 版本起)将 Styler 导出到 LaTeX。.to_latex 方法的文档提供了更详细的信息和大量示例。

更多关于 CSS 和 HTML#

层叠样式表(CSS)语言旨在影响浏览器如何渲染 HTML 元素,它有其自身的特点。它从不报告错误:它只是默默地忽略它们,并且不会按您期望的方式渲染您的对象,因此有时会令人沮丧。这里有一个关于 Styler 如何创建 HTML 和与 CSS 交互的非常简短的入门教程,并附带了有关常见陷阱的建议。

CSS 类和 ID#

附加到每个单元格的 CSS class 的精确结构如下。

  • 带有索引和列名称的单元格包含 index_namelevel<k>,其中 k 是它在 MultiIndex 中的级别

  • 索引标签单元格包括

    • row_heading

    • level<k>,其中 k 是 MultiIndex 中的级别

    • row<m>,其中 m 是行的数字位置

  • 列标签单元格包括

    • col_heading

    • level<k>,其中 k 是 MultiIndex 中的级别

    • col<n>,其中 n 是列的数字位置

  • 数据单元格包括

    • data

    • row<m>,其中 m 是单元格的数字位置。

    • col<n>,其中 n 是单元格的数字位置。

  • 空白单元格包括 blank

  • 已截断的单元格包括 col_trimrow_trim

id 的结构是 T_uuid_level<k>_row<m>_col<n>,其中 level<k> 仅在标题中使用,并且标题只会包含 row<m>col<n>,以其中一个必需的为准。默认情况下,我们还在每个行/列标识符前添加了一个唯一的 UUID,以便一个 DataFrame 中的样式不会与同一笔记本或页面中的另一个 DataFrame 的样式冲突。您可以在 Optimization 中了解更多关于 UUID 用法的信息。

我们可以通过调用 .to_html() 方法来查看 HTML 示例。

[71]:
print(pd.DataFrame([[1,2],[3,4]], index=['i1', 'i2'], columns=['c1', 'c2']).style.to_html())
<style type="text/css">
</style>
<table id="T_2c8a3">
  <thead>
    <tr>
      <th class="blank level0" >&nbsp;</th>
      <th id="T_2c8a3_level0_col0" class="col_heading level0 col0" >c1</th>
      <th id="T_2c8a3_level0_col1" class="col_heading level0 col1" >c2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th id="T_2c8a3_level0_row0" class="row_heading level0 row0" >i1</th>
      <td id="T_2c8a3_row0_col0" class="data row0 col0" >1</td>
      <td id="T_2c8a3_row0_col1" class="data row0 col1" >2</td>
    </tr>
    <tr>
      <th id="T_2c8a3_level0_row1" class="row_heading level0 row1" >i2</th>
      <td id="T_2c8a3_row1_col0" class="data row1 col0" >3</td>
      <td id="T_2c8a3_row1_col1" class="data row1 col1" >4</td>
    </tr>
  </tbody>
</table>

CSS 层次结构#

示例表明,当 CSS 样式重叠时,在 HTML 渲染中最后出现的样式将生效。因此,以下内容会产生不同的结果:

[72]:
df4 = pd.DataFrame([['text']])
df4.style.map(lambda x: 'color:green;')\
         .map(lambda x: 'color:red;')
[72]:
  0
0 text
[73]:
df4.style.map(lambda x: 'color:red;')\
         .map(lambda x: 'color:green;')
[73]:
  0
0 text

这仅适用于层级或重要性相等的 CSS 规则。您可以在此处了解有关 CSS specificity here 的更多信息,但就我们的目的而言,足以概括关键点:

每个 HTML 元素的 CSS 重要性分数是通过从零开始并添加以下值得出的:

  • 1000 用于内联样式属性

  • 100 用于每个 ID

  • 10 用于每个属性、类或伪类

  • 1 用于每个元素名称或伪元素

让我们用这个来描述以下配置的操作

[74]:
df4.style.set_uuid('a_')\
         .set_table_styles([{'selector': 'td', 'props': 'color:red;'}])\
         .map(lambda x: 'color:green;')
[74]:
  0
0 text

此文本为红色,因为生成的选择器 #T_a_ td 的值为 101(ID 加上元素),而 #T_a_row0_col0 的值为 100(ID),因此被认为较低,尽管在 HTML 中它出现在前一个之后。

[75]:
df4.style.set_uuid('b_')\
         .set_table_styles([{'selector': 'td', 'props': 'color:red;'},
                            {'selector': '.cls-1', 'props': 'color:blue;'}])\
         .map(lambda x: 'color:green;')\
         .set_td_classes(pd.DataFrame([['cls-1']]))
[75]:
  0
0 text

在上例中,文本为蓝色,因为选择器 #T_b_ .cls-1 的值为 110(ID 加上类),具有优先权。

[76]:
df4.style.set_uuid('c_')\
         .set_table_styles([{'selector': 'td', 'props': 'color:red;'},
                            {'selector': '.cls-1', 'props': 'color:blue;'},
                            {'selector': 'td.data', 'props': 'color:yellow;'}])\
         .map(lambda x: 'color:green;')\
         .set_td_classes(pd.DataFrame([['cls-1']]))
[76]:
  0
0 text

现在我们创建了另一个表样式,这次的选择器 ``T_c_ td.data``(ID 加上元素加上类)被提升到 111。

如果您的样式未能应用,并且非常令人沮丧,请尝试使用 !important 这个万能牌。

[77]:
df4.style.set_uuid('d_')\
         .set_table_styles([{'selector': 'td', 'props': 'color:red;'},
                            {'selector': '.cls-1', 'props': 'color:blue;'},
                            {'selector': 'td.data', 'props': 'color:yellow;'}])\
         .map(lambda x: 'color:green !important;')\
         .set_td_classes(pd.DataFrame([['cls-1']]))
[77]:
  0
0 text

最终还是实现了绿色文本!

可扩展性#

Pandas 的核心是其“高性能、易于使用的数据结构”,并将继续是。考虑到这一点,我们希望 DataFrame.style 能够实现两个目标:

  • 提供一个交互式使用起来令人愉悦且“足够好”以满足许多任务的 API

  • 为专用库提供构建基础

如果您在此基础上构建了一个很棒的库,请告诉我们,我们将 link 到它。

子类化#

如果默认模板不能完全满足您的需求,您可以对 Styler 进行子类化,并扩展或覆盖模板。我们将举例说明如何扩展默认模板,在每个表之前插入自定义标题。

[78]:
from jinja2 import Environment, ChoiceLoader, FileSystemLoader
from IPython.display import HTML
from pandas.io.formats.style import Styler

我们将使用以下模板:

[79]:
with open("templates/myhtml.tpl") as f:
    print(f.read())
{% extends "html_table.tpl" %}
{% block table %}
<h1>{{ table_title|default("My Table") }}</h1>
{{ super() }}
{% endblock table %}

既然我们已经创建了模板,就需要设置一个知道该模板的 Styler 的子类。

[80]:
class MyStyler(Styler):
    env = Environment(
        loader=ChoiceLoader([
            FileSystemLoader("templates"),  # contains ours
            Styler.loader,  # the default
        ])
    )
    template_html_table = env.get_template("myhtml.tpl")

请注意,我们将原始加载器包含在环境的加载器中。这是因为我们扩展了原始模板,所以 Jinja 环境需要能够找到它。

现在我们可以使用自定义的 styler。它的 __init__ 接受一个 DataFrame。

[81]:
MyStyler(df3)
[81]:

My Table

    c1 c2 c3 c4
A r1 -1.048553 -1.420018 -1.706270 1.950775
r2 -0.509652 -0.438074 -1.252795 0.777490
B r1 -1.613898 -0.212740 -0.895467 0.386902
r2 -0.510805 -1.180632 -0.028182 0.428332

我们的自定义模板接受一个 table_title 关键字参数。我们可以在 .to_html 方法中提供该值。

[82]:
HTML(MyStyler(df3).to_html(table_title="Extending Example"))
[82]:

Extending Example

    c1 c2 c3 c4
A r1 -1.048553 -1.420018 -1.706270 1.950775
r2 -0.509652 -0.438074 -1.252795 0.777490
B r1 -1.613898 -0.212740 -0.895467 0.386902
r2 -0.510805 -1.180632 -0.028182 0.428332

为了方便起见,我们提供了 Styler.from_custom_template 方法,它与自定义子类执行的操作相同。

[83]:
EasyStyler = Styler.from_custom_template("templates", "myhtml.tpl")
HTML(EasyStyler(df3).to_html(table_title="Another Title"))
[83]:

Another Title

    c1 c2 c3 c4
A r1 -1.048553 -1.420018 -1.706270 1.950775
r2 -0.509652 -0.438074 -1.252795 0.777490
B r1 -1.613898 -0.212740 -0.895467 0.386902
r2 -0.510805 -1.180632 -0.028182 0.428332

模板结构#

以下是样式生成模板和表生成模板的模板结构:

样式模板:

[85]:
HTML(style_structure)
[85]:
before_style
style
<style type="text/css">
table_styles
before_cellstyle
cellstyle
</style>

表模板:

[87]:
HTML(table_structure)
[87]:
before_table
table
<table ...>
caption
thead
before_head_rows
head_tr (loop over headers)
after_head_rows
tbody
before_rows
tr (loop over data rows)
after_rows
</table>
after_table

有关更多详细信息,请参阅 GitHub repo 中的模板。