表の可視化#

このセクションでは、Stylerクラスを使用して、表形式データの可視化を示します。チャートによる可視化については、チャートによる可視化を参照してください。このドキュメントはJupyter Notebookとして記述されており、こちらで閲覧またはダウンロードできます。

Stylerオブジェクトと表示のカスタマイズ#

スタイル設定と出力表示のカスタマイズは、DataFrameのデータが処理された**後**に行う必要があります。DataFrameへのさらなる変更があった場合、Stylerは**動的に更新されません**。DataFrame.style属性は、Stylerオブジェクトを返すプロパティです。Jupyter Notebookでは_repr_html_メソッドが定義されているため、自動的にレンダリングされます。

主に小規模データ向けに設計されていますが、大規模データにも使用できるStylerは、現在、これらの形式への出力が可能です。

  • HTML

  • LaTeX

  • 文字列(およびCSVも)

  • Excel

  • (JSONは現在利用できません)

これらのうち最初の3つは、出力のフォーマットとカスタマイズを目的とした表示カスタマイズメソッドを備えています。これらには以下が含まれます。

  • .format()および.format_index()を使用して、値、インデックス、列ヘッダーをフォーマットします。

  • .relabel_index()を使用して、インデックスまたは列ヘッダーのラベルの名前を変更します。

  • .hide()を使用して、特定の列、インデックスおよび/または列ヘッダー、またはインデックス名を非表示にします。

  • .concat()を使用して、同様のDataFrameを連結します。

表示のフォーマット#

値のフォーマット#

Stylerは、データ値とインデックスまたは列ヘッダーの両方において、表示値と実際の値を区別します。表示値を制御するために、各セルにテキストが文字列として表示され、.format().format_index()メソッドを使用して、フォーマット指定文字列または単一の値を受け取って文字列を返す関数に従って操作できます。これは、テーブル全体、インデックス、個々の列、またはMultiIndexレベルに対して定義できます。インデックス名も上書きできます。

さらに、format関数は、浮動小数点数フォーマットに役立つ**precision**引数の他に、その他のロケールをサポートするための**decimal**および**thousands**セパレータ、欠損データを表示するための**na_rep**引数、安全なHTMLまたは安全なLaTeXの表示に役立つ**escape**および**hyperlinks**引数も備えています。デフォルトのフォーマッタは、styler.format.precisionオプションなどのpandasのグローバルオプションを採用するように構成されており、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]:
  文字列 整数 浮動小数点数
行1 Adam 1 1,123
行2 Mike 3 1.000,230

Stylerを使用して表示を操作することは便利な機能です。他の目的のためにインデックスとデータ値を維持することで、より高度な制御が可能になります。表示方法に合わせて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]:
東京 北京
2021-01-01 4.283538 3.737533
2021-01-02 2.233870 2.724672
2021-01-03 4.134636 3.668654
2021-01-04 4.218660 4.603441
2021-01-05 4.510633 4.025532
2021-01-06 0.605171 2.517437
2021-01-07 0.760045 4.558718
2021-01-08 0.092691 3.369846
2021-01-09 3.347177 1.783511
2021-01-10 2.976637 4.216592
[4]:
weather_df.loc["2021-01-04":"2021-01-08"].style.pipe(make_pretty)
[4]:
天候状況
  東京 北京
月曜日 大雨 大雨
火曜日 大雨 大雨
水曜日 晴れ
木曜日 晴れ 大雨
金曜日 晴れ 大雨

データの非表示#

インデックスと列ヘッダーは完全に非表示にすることができます。また、除外したい行または列を選択することもできます。これらのオプションは両方とも同じメソッドを使用して実行されます。

引数なしで.hide()を呼び出すことで、インデックスをレンダリングから非表示にすることができます。これは、インデックスが整数ベースの場合に便利です。同様に、引数なしで.hide(axis=”columns”)を呼び出すことで、列ヘッダーを非表示にすることができます。

同じ.hide()メソッドを呼び出し、subset引数に行/列ラベル、リストのようなもの、または行/列ラベルのスライスを渡すことで、特定の行または列をレンダリングから非表示にすることができます。

非表示にしても、CSSクラスの整数配置は変更されません。たとえば、DataFrameの先頭2列を非表示にしても、col0col1は単に無視されるため、列クラスのインデックス付けはcol2から始まります。

[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 1.109789 0.823589
3 0.021072 -0.378961

関数を**表示**機能に反転するには、非表示アイテムのリストを作成するのがベストプラクティスです。

[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.251097 -1.742081 1.388132
2 0.407566 -0.879413 -1.049158
4 -1.591653 0.122700 -0.075033

DataFrame出力の連結#

同じ列を共有している場合、2つ以上の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.3 0.3 -1.7 -0.6 1.4
1 -0.7 1.1 1.2 0.8 1.4
2 0.4 -1.5 -0.9 -1.3 -1.0
3 -0.2 0.0 1.7 -0.4 0.1
4 -1.6 0.3 0.1 -0.2 -0.1
合計 -2.285 0.239 0.459 -1.613 1.758
平均 -0.457 0.048 0.092 -0.323 0.352

StylerオブジェクトとHTML#

Stylerはもともと、幅広いHTMLフォーマットオプションをサポートするために作成されました。そのHTML出力はHTML <table>を作成し、CSSスタイル言語を利用して、色、フォント、境界線、背景など、多くのパラメータを操作します。HTMLテーブルのスタイル設定の詳細については、こちらを参照してください。これにより、すぐに多くの柔軟性が得られ、Web開発者は既存のユーザーインターフェースデザインにDataFrameを統合することもできます。

以下では、標準のDataFrame HTML表現と非常に類似したデフォルトの出力を示します。しかし、ここでのHTMLには、スタイルをまだ作成していない場合でも、すでに各セルにいくつかのCSSクラスが添付されています。.to_html()メソッドを呼び出すことで、これらのCSSクラスを確認できます。このメソッドは生のHTMLを文字列として返し、さらに処理したりファイルに追加したりするのに役立ちます。詳細についてはCSSと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]:
モデル 決定木 回帰 ランダム
予測 腫瘍 非腫瘍 腫瘍 非腫瘍 腫瘍 非腫瘍
実際のラベル            
腫瘍(陽性) 38.000000 2.000000 18.000000 22.000000 21 nan
非腫瘍(陰性) 19.000000 439.000000 6.000000 452.000000 226 232.000000
[10]:
s
[10]:
複数の癌予測モデルの混同行列。
モデル 決定木 回帰
予測 腫瘍 非腫瘍 腫瘍 非腫瘍
実際のラベル        
腫瘍(陽性) 38 2 18 22
非腫瘍(陰性) 19 439 6 452

最初のステップとして、DataFrameからStylerオブジェクトを作成し、.hide()を使用して不要な列を非表示にすることで、対象範囲を選択します。

[11]:
s = df.style.format('{:.0f}').hide([('Random', 'Tumour'), ('Random', 'Non-Tumour')], axis="columns")
s
[11]:
モデル 決定木 回帰
予測 腫瘍 非腫瘍 腫瘍 非腫瘍
実際のラベル        
腫瘍(陽性) 38 2 18 22
非腫瘍(陰性) 19 439 6 452

スタイルを追加するためのメソッド#

StylerにカスタムCSSスタイルを追加する主な方法は3つあります。

  • .set_table_styles()を使用して、指定された内部CSSを使用してテーブルの広い領域を制御します。テーブルスタイルは、テーブルのすべての個々の部分を制御するCSSセレクタとプロパティを追加する柔軟性を提供しますが、個々のセルの指定には扱いにくいです。また、テーブルスタイルはExcelにエクスポートできないことに注意してください。

  • .set_td_classes() を使用して、外部CSSクラスをデータセルに直接リンクするか、.set_table_styles() で作成された内部CSSクラスをリンクします。こちらを参照してください。これらは列ヘッダー行またはインデックスでは使用できず、Excelにもエクスポートされません。

  • .apply().map() 関数を使用して、特定のデータセルに直接内部CSSを追加します。こちらを参照してください。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]:
モデル 決定木 回帰
予測 腫瘍 非腫瘍 腫瘍 非腫瘍
実際のラベル        
腫瘍(陽性) 38 2 18 22
非腫瘍(陰性) 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]:
モデル 決定木 回帰
予測 腫瘍 非腫瘍 腫瘍 非腫瘍
実際のラベル        
腫瘍(陽性) 38 2 18 22
非腫瘍(陰性) 19 439 6 452

(バージョン1.2.0以降)便宜的なメソッドとして、行または列のキーを含む**辞書**を.set_table_styles()に渡すこともできます。内部的には、Stylerはキーのインデックスを作成し、指定されたCSSセレクターに必要な.col<m>または.row<n>クラスを追加します。

[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]:
モデル 決定木 回帰
予測 腫瘍 非腫瘍 腫瘍 非腫瘍
実際のラベル        
腫瘍(陽性) 38 2 18 22
非腫瘍(陰性) 19 439 6 452

クラスの設定と外部CSSへのリンク#

Webサイトを設計したことがある場合、テーブルとセルのオブジェクトのスタイルを制御する外部CSSファイルが既に存在する可能性があります。PythonですべてのCSSを複製する(そしてメンテナンス作業を複製する)のではなく、これらのネイティブファイルを使用したい場合があります。

テーブル属性#

.set_table_attributes()を使用して、メインの<table>classを追加することは非常に簡単です。このメソッドはインラインスタイルもアタッチできます—CSS階層で詳細を確認してください。

[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()メソッドは、基礎となるStylerのDataFrameとインデックスと列が一致するDataFrameを受け入れます。そのDataFrameには、個々のデータセル(<table><td>要素)に追加するcssクラスとして文字列が含まれます。外部CSSを使用する代わりに、内部でクラスを作成し、テーブルスタイルに追加します。ボーダーの追加は、ツールチップに関するセクションまで保存します。

[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]:
モデル 決定木 回帰
予測 腫瘍 非腫瘍 腫瘍 非腫瘍
実際のラベル        
腫瘍(陽性) 38 2 18 22
非腫瘍(陰性) 19 439 6 452

Styler関数#

データへの作用#

スタイル関数を渡すために、次のメソッドを使用します。これらのメソッドはどちらも関数(およびその他のキーワード引数)を受け取り、特定の方法でDataFrameに適用してCSSスタイルをレンダリングします。

  • .map()(要素単位):単一の値を受け取り、CSS属性値ペアを含む文字列を返す関数を受け入れます。

  • .apply()(列/行/テーブル単位):SeriesまたはDataFrameを受け取り、各要素がCSS属性値ペアを含む文字列である同一の形状のSeries、DataFrame、またはNumPy配列を返す関数を受け入れます。このメソッドは、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

この最後の例は、一部のスタイルが他のスタイルによって上書きされていることを示しています。一般的に、最後に適用されたスタイルがアクティブになりますが、CSS階層に関するセクションで詳細を確認できます。これらのスタイルをDataFrameのより詳細な部分に適用することもできます—サブセットスライシングに関するセクションで詳細を確認してください。

クラスのみを使用してこの機能の一部を複製することは可能ですが、より面倒になる可能性があります。最適化の3)を参照してください。

デバッグヒント:スタイル関数の記述に問題がある場合は、DataFrame.applyに渡してみてください。Styler.applyは内部的にDataFrame.applyを使用するため、結果は同じになります。また、DataFrame.applyを使用すると、目的の関数のCSS文字列出力を各セルで検査できます。

インデックスと列ヘッダーへの作用#

ヘッダーについても、同様の適用が次のものを使用して行われます。

  • .map_index()(要素単位):単一の値を受け取り、CSS属性値ペアを含む文字列を返す関数を受け入れます。

  • .apply_index()(レベル単位):Seriesを受け取り、各要素がCSS属性値ペアを含む文字列である同一の形状のSeriesまたはNumPy配列を返す関数を受け入れます。このメソッドは、インデックスの各レベルを一度に渡します。インデックスのスタイルを設定するにはaxis=0を、列ヘッダーのスタイルを設定するにはaxis=1を使用します。

MultiIndexlevelを選択できますが、現在、これらのメソッドには同様の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]:
複数の癌予測モデルの混同行列。
モデル 決定木 回帰
予測 腫瘍 非腫瘍 腫瘍 非腫瘍
実際のラベル        
腫瘍(陽性) 38 2 18 22
非腫瘍(陰性) 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]:
複数の癌予測モデルの混同行列。
モデル 決定木 回帰
予測 腫瘍 非腫瘍 腫瘍 非腫瘍
実際のラベル        
腫瘍(陽性) 38 2 18 22
非腫瘍(陰性) 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]:
複数の癌予測モデルの混同行列。
モデル 決定木 回帰
予測 腫瘍 非腫瘍 腫瘍 非腫瘍
実際のラベル        
腫瘍(陽性) 38 2 18 22
非腫瘍(陰性) 19 439 6 452

スライシングによる細かい制御#

これまで紹介したStyler.apply関数とStyler.map関数の例では、subset引数の使用は示していませんでした。これは非常に便利な引数で、柔軟性を高めます。この引数を使用すると、style関数にそのロジックを記述することなく、特定の行や列にスタイルを適用できます。

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

3列目と4列目の最大値を赤いテキストで強調表示するためにsubsetを使用します。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と組み合わせると、より柔軟に2次元をインデックス付けできます。

[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

**条件付きフィルタリング**を提供することもできます。

1列目と3列目の合計が-2.0未満の場合にのみ、2列目と4列目の最大値を強調表示したいとします(基本的に行(:,'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

現在サポートされているのはラベルベースのスライシングのみで、位置ベースや呼び出し可能オブジェクトはサポートされていません。

スタイル関数がsubsetまたはaxisキーワード引数を使用する場合は、functools.partialで関数をラップし、そのキーワードを部分適用することを検討してください。

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

最適化#

一般的に、小さなテーブルやほとんどの場合、レンダリングされたHTMLを最適化する必要はなく、実際にはお勧めしません。検討する価値のあるケースは2つあります。

  • 非常に大きなHTMLテーブルをレンダリングおよびスタイル設定する場合、特定のブラウザのパフォーマンスに問題が発生することがあります。

  • Stylerを使用してオンラインユーザーインターフェースの一部を動的に作成し、ネットワークパフォーマンスを向上させたい場合。

ここでは、実装するための手順を以下に示します。

1. UUIDとcell_idsの削除#

uuidを無視し、cell_idsFalseに設定します。これにより、不要な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. すべてのバイトが重要であれば、文字列置換を使用する#

不要なHTMLを削除したり、デフォルトのCSS辞書を置き換えることで、デフォルトのクラス名を短くすることができます。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に「組み込まれて」おり、自分で記述して適用する必要はありません。そのような関数の現在のリストは次のとおりです。

  • .highlight_null:欠損データの識別に使用します。

  • .highlight_min.highlight_max:データの極値の識別に使用します。

  • .highlight_between.highlight_quantile:データ内のクラスの識別に使用します。

  • .background_gradient:数値スケールに基づいて、セルまたはその他の値に基づいてセルを強調表示するための柔軟な方法です。

  • .text_gradient:数値スケールに基づいてテキストを強調表示するための同様の方法です。

  • .bar:セル背景内にミニチャートを表示します。

各関数の個別ドキュメントには、多くの場合、引数の詳細な例が記載されています。

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_gradientメソッドとtext_gradientメソッドを使用して「ヒートマップ」を作成できます。これにはmatplotlibが必要であり、美しいカラーマップを取得するためにSeabornを使用します。

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

df2.style.background_gradient(cmap=cm)
[53]:
  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
[54]:
df2.style.text_gradient(cmap=cm)
[54]:
  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

.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、セルの基になるCSSpropsを設定して組み合わせることで上記を変更する方法を示します。テキストと棒を表示するためのスペースを残します。また、matplotlibのカラーマップを使用して、テキストの色を棒と同じ色にするためにtext_gradientを使用します(ただし、この場合、この追加の効果がない方が視覚化は良いでしょう)。

[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

次の例は、新しいalignオプションの動作の概要を示すことを目的としています。

[59]:
HTML(head)
[59]:
位置合わせ すべて負 負と正の両方 すべて正 大きな正
-100
-60
-30
-20
-10
-5
0
90
10
20
50
100
100
103
101
102
-100
-60
-30
-20
-10
-5
0
90
10
20
50
100
100
103
101
102
ゼロ
-100
-60
-30
-20
-10
-5
0
90
10
20
50
100
100
103
101
102
中央
-100
-60
-30
-20
-10
-5
0
90
10
20
50
100
100
103
101
102
平均
-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用に素晴らしいスタイルを作成し、同じスタイルを2番目のDataFrameに適用したいとします。df1.style.exportを使用してスタイルをエクスポートし、df1.style.setを使用して2番目の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の最適化もいくつかあります。

  • スタイルを適用することしかできず、サブクラス化による場合を除いて、新しい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())
[64]:
ホバーして拡大
  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
0 0.23 1.03 -0.84 -0.59 -0.96 -0.22 -0.62 1.84 -2.05 0.87 -0.92 -0.23 2.15 -1.33 0.08 -1.25 1.20 -1.05 1.06 -0.42 2.29 -2.59 2.82 0.68 -1.58
1 -1.75 1.56 -1.13 -1.10 1.03 0.00 -2.46 3.45 -1.66 1.27 -0.52 -0.02 1.52 -1.09 -1.86 -1.13 -0.68 -0.81 0.35 -0.06 1.79 -2.82 2.26 0.78 0.44
2 -0.65 3.22 -1.76 0.52 2.20 -0.37 -3.00 3.73 -1.87 2.46 0.21 -0.24 -0.10 -0.78 -3.02 -0.82 -0.21 -0.23 0.86 -0.68 1.45 -4.89 3.03 1.91 0.61
3 -1.62 3.71 -2.31 0.43 4.17 -0.43 -3.86 4.16 -2.15 1.08 0.12 0.60 -0.89 0.27 -3.67 -2.71 -0.31 -1.59 1.35 -1.83 0.91 -5.80 2.81 2.11 0.28
4 -3.35 4.48 -1.86 -1.70 5.19 -1.02 -3.81 4.72 -0.72 1.08 -0.18 0.83 -0.22 -1.08 -4.27 -2.88 -0.97 -1.78 1.53 -1.80 2.21 -6.34 3.34 2.49 2.09
5 -0.84 4.23 -1.65 -2.00 5.34 -0.99 -4.13 3.94 -1.06 -0.94 1.24 0.09 -1.78 -0.11 -4.45 -0.85 -2.06 -1.35 0.80 -1.63 1.54 -6.51 2.80 2.14 3.77
6 -0.74 5.35 -2.11 -1.13 4.20 -1.85 -3.20 3.76 -3.22 -1.23 0.34 0.57 -1.82 0.54 -4.43 -1.83 -4.03 -2.62 -0.20 -4.68 1.93 -8.46 3.34 2.52 5.81
7 -0.44 4.69 -2.30 -0.21 5.93 -2.63 -1.83 5.46 -4.50 -3.16 -1.73 0.18 0.11 0.04 -5.99 -0.45 -6.20 -3.89 0.71 -3.95 0.67 -7.26 2.97 3.39 6.66
8 0.92 5.80 -3.33 -0.65 5.99 -3.19 -1.83 5.63 -3.53 -1.30 -1.61 0.82 -2.45 -0.40 -6.06 -0.52 -6.60 -3.48 -0.04 -4.60 0.51 -5.85 3.23 2.40 5.08
9 0.38 5.54 -4.49 -0.80 7.05 -2.64 -0.44 5.35 -1.96 -0.33 -0.80 0.26 -3.37 -0.82 -6.05 -2.61 -8.45 -4.45 0.41 -4.71 1.89 -6.93 2.14 3.00 5.16
10 2.06 5.84 -3.90 -0.98 7.78 -2.49 -0.59 5.59 -2.22 -0.71 -0.46 1.80 -2.79 0.48 -5.97 -3.44 -7.77 -5.49 -0.70 -4.61 -0.52 -7.72 1.54 5.02 5.81
11 1.86 4.47 -2.17 -1.38 5.90 -0.49 0.02 5.78 -1.04 -0.60 0.49 1.96 -1.47 1.88 -5.92 -4.55 -8.15 -3.42 -2.24 -4.33 -1.17 -7.90 1.36 5.31 5.83
12 3.19 4.22 -3.06 -2.27 5.93 -2.64 0.33 6.72 -2.84 -0.20 1.89 2.63 -1.53 0.75 -5.27 -4.53 -7.57 -2.85 -2.17 -4.78 -1.13 -8.99 2.11 6.42 5.60
13 2.31 4.45 -3.87 -2.05 6.76 -3.25 -2.17 7.99 -2.56 -0.80 0.71 2.33 -0.16 -0.46 -5.10 -3.79 -7.58 -4.00 0.33 -3.67 -1.05 -8.71 2.47 5.87 6.71
14 3.78 4.33 -3.88 -1.58 6.22 -3.23 -1.46 5.57 -2.93 -0.33 -0.97 1.72 3.61 0.29 -4.21 -4.10 -6.68 -4.50 -2.19 -2.43 -1.64 -9.36 3.36 6.11 7.53
15 5.64 5.31 -3.98 -2.26 5.91 -3.30 -1.03 5.68 -3.06 -0.33 -1.16 2.19 4.20 1.01 -3.22 -4.31 -5.74 -4.44 -2.30 -1.36 -1.20 -11.27 2.59 6.69 5.91
16 4.08 4.34 -2.44 -3.30 6.04 -2.52 -0.47 5.28 -4.84 1.58 0.23 0.10 5.79 1.80 -3.13 -3.85 -5.53 -2.97 -2.13 -1.15 -0.56 -13.13 2.07 6.16 4.94
17 5.64 4.57 -3.53 -3.76 6.58 -2.58 -0.75 6.58 -4.78 3.63 -0.29 0.56 5.76 2.05 -2.27 -2.31 -4.95 -3.16 -3.06 -2.43 0.84 -12.57 3.56 7.36 4.70
18 5.99 5.82 -2.85 -4.15 7.12 -3.32 -1.21 7.93 -4.85 1.44 -0.63 0.35 7.47 0.87 -1.52 -2.09 -4.23 -2.55 -2.46 -2.89 1.90 -9.74 3.43 7.07 4.39
19 4.03 6.23 -4.10 -4.11 7.19 -4.10 -1.52 6.53 -5.21 -0.24 0.01 1.16 6.43 -1.97 -2.64 -1.66 -5.20 -3.25 -2.87 -1.65 1.64 -10.66 2.83 7.48 3.94

固定ヘッダー#

ノートブックに大きな行列またはDataFrameを表示する場合でも、常に列ヘッダーと行ヘッダーを表示する必要がある場合は、テーブルスタイルのCSSを操作する.set_stickyメソッドを使用できます。

[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.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
1 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
2 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
3 -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
4 -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
5 -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
6 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
7 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
8 -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
9 -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
10 -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
11 -0.625210 0.288911 0.288374 -1.372667 -0.591395 -0.478942 1.335664 -0.459855 -1.615975 -1.189676 0.374767 -2.488733 0.586656 -1.422008 0.496030 1.911128 -0.560660 -0.499614 -0.372171 -1.833069 0.237124 -0.944446 0.912140 0.359790 -1.359235 0.166966 -0.047107 -0.279789 -0.594454 -0.739013 -1.527645 0.401668 1.791252 -2.774848 0.523873 2.207585 0.488999 -0.339283 0.131711 0.018409 1.186551 -0.424318 1.554994 -0.205917 -0.934975 0.654102 -1.227761 -0.461025 -0.421201 -0.058615 -0.584563 0.336913 -0.477102 -1.381463 0.757745 -0.268968 0.034870 1.231686 0.236600 1.234720 -0.040247 0.029582 1.034905 0.380204 -0.012108 -0.859511 -0.990340 -1.205172 -1.030178 0.426676 0.497796 -0.876808 0.957963 0.173016 0.131612 -1.003556 -1.069908 -1.799207 1.429598 -0.116015 -1.454980 0.261917 0.444412 0.273290 0.844115 0.218745 -1.033350 -1.188295 0.058373 0.800523 -1.627068 0.861651 0.871018 -0.003733 -0.243354 0.947296 0.509406 0.044546 0.266896 1.337165
12 0.699142 -1.928033 0.105363 1.042322 0.715206 -0.763783 0.098798 -1.157898 0.134105 0.042041 0.674826 0.165649 -1.622970 -3.131274 0.597649 -1.880331 0.663980 -0.256033 -1.524058 0.492799 0.221163 0.429622 -0.659584 1.264506 -0.032131 -2.114907 -0.264043 0.457835 -0.676837 -0.629003 0.489145 -0.551686 0.942622 -0.512043 -0.455893 0.021244 -0.178035 -2.498073 -0.171292 0.323510 -0.545163 -0.668909 -0.150031 0.521620 -0.428980 0.676463 0.369081 -0.724832 0.793542 1.237422 0.401275 2.141523 0.249012 0.486755 -0.163274 0.592222 -0.292600 -0.547168 0.619104 -0.013605 0.776734 0.131424 1.189480 -0.666317 -0.939036 1.105515 0.621452 1.586605 -0.760970 1.649646 0.283199 1.275812 -0.452012 0.301361 -0.976951 -0.268106 -0.079255 -1.258332 2.216658 -1.175988 -0.863497 -1.653022 -0.561514 0.450753 0.417200 0.094676 -2.231054 1.316862 -0.477441 0.646654 -0.200252 1.074354 -0.058176 0.120990 0.222522 -0.179507 0.421655 -0.914341 -0.234178 0.741524
13 0.932714 1.423761 -1.280835 0.347882 -0.863171 -0.852580 1.044933 2.094536 0.806206 0.416201 -1.109503 0.145302 -0.996871 0.325456 -0.605081 1.175326 1.645054 0.293432 -2.766822 1.032849 0.079115 -1.414132 1.463376 2.335486 0.411951 -0.048543 0.159284 -0.651554 -1.093128 1.568390 -0.077807 -2.390779 -0.842346 -0.229675 -0.999072 -1.367219 -0.792042 -1.878575 1.451452 1.266250 -0.734315 0.266152 0.735523 -0.430860 0.229864 0.850083 -2.241241 1.063850 0.289409 -0.354360 0.113063 -0.173006 1.386998 1.886236 0.587119 -0.961133 0.399295 1.461560 0.310823 0.280220 -0.879103 -1.326348 0.003337 -1.085908 -0.436723 2.111926 0.106068 0.615597 2.152996 -0.196155 0.025747 -0.039061 0.656823 -0.347105 2.513979 1.758070 1.288473 -0.739185 -0.691592 -0.098728 -0.276386 0.489981 0.516278 -0.838258 0.596673 -0.331053 0.521174 -0.145023 0.836693 -1.092166 0.361733 -1.169981 0.046731 0.655377 -0.756852 1.285805 -0.095019 0.360253 1.370621 0.083010
14 0.888893 2.288725 -1.032332 0.212273 -1.091826 1.692498 1.025367 0.550854 0.679430 -1.335712 -0.798341 2.265351 -1.006938 2.059761 0.420266 -1.189657 0.506674 0.260847 -0.533145 0.727267 1.412276 1.482106 -0.996258 0.588641 -0.412642 -0.920733 -0.874691 0.839002 0.501668 -0.342493 -0.533806 -2.146352 -0.597339 0.115726 0.850683 -0.752239 0.377263 -0.561982 0.262783 -0.356676 -0.367462 0.753611 -1.267414 -1.330698 -0.536453 0.840938 -0.763108 -0.268100 -0.677424 1.606831 0.151732 -2.085701 1.219296 0.400863 0.591165 -1.485213 1.501979 1.196569 -0.214154 0.339554 -0.034446 1.176452 0.546340 -1.255630 -1.309210 -0.445437 0.189437 -0.737463 0.843767 -0.605632 -0.060777 0.409310 1.285569 -0.622638 1.018193 0.880680 0.046805 -1.818058 -0.809829 0.875224 0.409569 -0.116621 -1.238919 3.305724 -0.024121 -1.756500 1.328958 0.507593 -0.866554 -2.240848 -0.661376 -0.671824 0.215720 -0.296326 0.481402 0.829645 -0.721025 1.263914 0.549047 -1.234945
15 -1.978838 0.721823 -0.559067 -1.235243 0.420716 -0.598845 0.359576 -0.619366 -1.757772 -1.156251 0.705212 0.875071 -1.020376 0.394760 -0.147970 0.230249 1.355203 1.794488 2.678058 -0.153565 -0.460959 -0.098108 -1.407930 -2.487702 1.823014 0.099873 -0.517603 -0.509311 -1.833175 -0.900906 0.459493 -0.655440 1.466122 -1.531389 -0.422106 0.421422 0.578615 0.259795 0.018941 -0.168726 1.611107 -1.586550 -1.384941 0.858377 1.033242 1.701343 1.748344 -0.371182 -0.843575 2.089641 -0.345430 -1.740556 0.141915 -2.197138 0.689569 -0.150025 0.287456 0.654016 -1.521919 -0.918008 -0.587528 0.230636 0.262637 0.615674 0.600044 -0.494699 -0.743089 0.220026 -0.242207 0.528216 -0.328174 -1.536517 -1.476640 -1.162114 -1.260222 1.106252 -1.467408 -0.349341 -1.841217 0.031296 -0.076475 -0.353383 0.807545 0.779064 -2.398417 -0.267828 1.549734 0.814397 0.284770 -0.659369 0.761040 -0.722067 0.810332 1.501295 1.440865 -1.367459 -0.700301 -1.540662 0.159837 -0.625415

MultiIndex、さらには特定のレベルだけを固定することも可能です。

[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.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
1 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
2 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
3 -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 -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
1 -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
2 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
3 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
B 0 0 -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
1 -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
2 -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
3 -0.625210 0.288911 0.288374 -1.372667 -0.591395 -0.478942 1.335664 -0.459855 -1.615975 -1.189676 0.374767 -2.488733 0.586656 -1.422008 0.496030 1.911128 -0.560660 -0.499614 -0.372171 -1.833069 0.237124 -0.944446 0.912140 0.359790 -1.359235 0.166966 -0.047107 -0.279789 -0.594454 -0.739013 -1.527645 0.401668 1.791252 -2.774848 0.523873 2.207585 0.488999 -0.339283 0.131711 0.018409 1.186551 -0.424318 1.554994 -0.205917 -0.934975 0.654102 -1.227761 -0.461025 -0.421201 -0.058615 -0.584563 0.336913 -0.477102 -1.381463 0.757745 -0.268968 0.034870 1.231686 0.236600 1.234720 -0.040247 0.029582 1.034905 0.380204 -0.012108 -0.859511 -0.990340 -1.205172 -1.030178 0.426676 0.497796 -0.876808 0.957963 0.173016 0.131612 -1.003556 -1.069908 -1.799207 1.429598 -0.116015 -1.454980 0.261917 0.444412 0.273290 0.844115 0.218745 -1.033350 -1.188295 0.058373 0.800523 -1.627068 0.861651 0.871018 -0.003733 -0.243354 0.947296 0.509406 0.044546 0.266896 1.337165
1 0 0.699142 -1.928033 0.105363 1.042322 0.715206 -0.763783 0.098798 -1.157898 0.134105 0.042041 0.674826 0.165649 -1.622970 -3.131274 0.597649 -1.880331 0.663980 -0.256033 -1.524058 0.492799 0.221163 0.429622 -0.659584 1.264506 -0.032131 -2.114907 -0.264043 0.457835 -0.676837 -0.629003 0.489145 -0.551686 0.942622 -0.512043 -0.455893 0.021244 -0.178035 -2.498073 -0.171292 0.323510 -0.545163 -0.668909 -0.150031 0.521620 -0.428980 0.676463 0.369081 -0.724832 0.793542 1.237422 0.401275 2.141523 0.249012 0.486755 -0.163274 0.592222 -0.292600 -0.547168 0.619104 -0.013605 0.776734 0.131424 1.189480 -0.666317 -0.939036 1.105515 0.621452 1.586605 -0.760970 1.649646 0.283199 1.275812 -0.452012 0.301361 -0.976951 -0.268106 -0.079255 -1.258332 2.216658 -1.175988 -0.863497 -1.653022 -0.561514 0.450753 0.417200 0.094676 -2.231054 1.316862 -0.477441 0.646654 -0.200252 1.074354 -0.058176 0.120990 0.222522 -0.179507 0.421655 -0.914341 -0.234178 0.741524
1 0.932714 1.423761 -1.280835 0.347882 -0.863171 -0.852580 1.044933 2.094536 0.806206 0.416201 -1.109503 0.145302 -0.996871 0.325456 -0.605081 1.175326 1.645054 0.293432 -2.766822 1.032849 0.079115 -1.414132 1.463376 2.335486 0.411951 -0.048543 0.159284 -0.651554 -1.093128 1.568390 -0.077807 -2.390779 -0.842346 -0.229675 -0.999072 -1.367219 -0.792042 -1.878575 1.451452 1.266250 -0.734315 0.266152 0.735523 -0.430860 0.229864 0.850083 -2.241241 1.063850 0.289409 -0.354360 0.113063 -0.173006 1.386998 1.886236 0.587119 -0.961133 0.399295 1.461560 0.310823 0.280220 -0.879103 -1.326348 0.003337 -1.085908 -0.436723 2.111926 0.106068 0.615597 2.152996 -0.196155 0.025747 -0.039061 0.656823 -0.347105 2.513979 1.758070 1.288473 -0.739185 -0.691592 -0.098728 -0.276386 0.489981 0.516278 -0.838258 0.596673 -0.331053 0.521174 -0.145023 0.836693 -1.092166 0.361733 -1.169981 0.046731 0.655377 -0.756852 1.285805 -0.095019 0.360253 1.370621 0.083010
2 0.888893 2.288725 -1.032332 0.212273 -1.091826 1.692498 1.025367 0.550854 0.679430 -1.335712 -0.798341 2.265351 -1.006938 2.059761 0.420266 -1.189657 0.506674 0.260847 -0.533145 0.727267 1.412276 1.482106 -0.996258 0.588641 -0.412642 -0.920733 -0.874691 0.839002 0.501668 -0.342493 -0.533806 -2.146352 -0.597339 0.115726 0.850683 -0.752239 0.377263 -0.561982 0.262783 -0.356676 -0.367462 0.753611 -1.267414 -1.330698 -0.536453 0.840938 -0.763108 -0.268100 -0.677424 1.606831 0.151732 -2.085701 1.219296 0.400863 0.591165 -1.485213 1.501979 1.196569 -0.214154 0.339554 -0.034446 1.176452 0.546340 -1.255630 -1.309210 -0.445437 0.189437 -0.737463 0.843767 -0.605632 -0.060777 0.409310 1.285569 -0.622638 1.018193 0.880680 0.046805 -1.818058 -0.809829 0.875224 0.409569 -0.116621 -1.238919 3.305724 -0.024121 -1.756500 1.328958 0.507593 -0.866554 -2.240848 -0.661376 -0.671824 0.215720 -0.296326 0.481402 0.829645 -0.721025 1.263914 0.549047 -1.234945
3 -1.978838 0.721823 -0.559067 -1.235243 0.420716 -0.598845 0.359576 -0.619366 -1.757772 -1.156251 0.705212 0.875071 -1.020376 0.394760 -0.147970 0.230249 1.355203 1.794488 2.678058 -0.153565 -0.460959 -0.098108 -1.407930 -2.487702 1.823014 0.099873 -0.517603 -0.509311 -1.833175 -0.900906 0.459493 -0.655440 1.466122 -1.531389 -0.422106 0.421422 0.578615 0.259795 0.018941 -0.168726 1.611107 -1.586550 -1.384941 0.858377 1.033242 1.701343 1.748344 -0.371182 -0.843575 2.089641 -0.345430 -1.740556 0.141915 -2.197138 0.689569 -0.150025 0.287456 0.654016 -1.521919 -0.918008 -0.587528 0.230636 0.262637 0.615674 0.600044 -0.494699 -0.743089 0.220026 -0.242207 0.528216 -0.328174 -1.536517 -1.476640 -1.162114 -1.260222 1.106252 -1.467408 -0.349341 -1.841217 0.031296 -0.076475 -0.353383 0.807545 0.779064 -2.398417 -0.267828 1.549734 0.814397 0.284770 -0.659369 0.761040 -0.722067 0.810332 1.501295 1.440865 -1.367459 -0.700301 -1.540662 0.159837 -0.625415

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.dokyumento.jp" target="_blank">{}</a>', escape="html")

Excelへのエクスポート#

スタイル付きのDataFramesOpenPyXLまたはXlsxWriterエンジンを使用して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ワーキンググループを参照してください)。

  • 現在サポートされているのは、CSS2の指定されたカラー名と#rgbまたは#rrggbb形式の16進数のカラーのみです。

  • Excel固有のスタイルプロパティを設定するための擬似CSSプロパティも使用できます。

    • 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')

出力のスクリーンショット

Excel spreadsheet with styled DataFrame

LaTeXへのエクスポート#

StylerをLaTeXにエクスポートするためのサポートがあります(_バージョン1.3.0以降_)。.to_latexメソッドのドキュメントには、詳細と多数の例が記載されています。

CSSとHTMLについて#

ブラウザによるHTML要素のレンダリング方法に影響を与えるように設計されたカスケーディングスタイルシート(CSS)言語には、独自の特徴があります。エラーは決して報告されず、サイレントに無視され、意図したとおりにオブジェクトがレンダリングされないため、イライラすることがあります。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_trimまたはrow_trimが含まれます。

idの構造はT_uuid_level<k>_row<m>_col<n>です。ここで、level<k>は見出しでのみ使用され、見出しにはrow<m>またはcol<n>のいずれかが必要なものが含まれます。デフォルトでは、各行/列の識別子に、各DataFrameを一意に識別するUUIDをプレフィックスとして追加して、同じノートブックまたはページ内の別のスタイルと衝突しないようにしています。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_4dfc0">
  <thead>
    <tr>
      <th class="blank level0" >&nbsp;</th>
      <th id="T_4dfc0_level0_col0" class="col_heading level0 col0" >c1</th>
      <th id="T_4dfc0_level0_col1" class="col_heading level0 col1" >c2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th id="T_4dfc0_level0_row0" class="row_heading level0 row0" >i1</th>
      <td id="T_4dfc0_row0_col0" class="data row0 col0" >1</td>
      <td id="T_4dfc0_row0_col1" class="data row0 col1" >2</td>
    </tr>
    <tr>
      <th id="T_4dfc0_level0_row1" class="row_heading level0 row1" >i2</th>
      <td id="T_4dfc0_row1_col0" class="data row1 col0" >3</td>
      <td id="T_4dfc0_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 テキスト
[73]:
df4.style.map(lambda x: 'color:red;')\
         .map(lambda x: 'color:green;')
[73]:
  0
0 テキスト

これは、階層または重要度が同等のCSSルールにのみ当てはまります。CSSの特異性についてはこちらで詳しく読むことができますが、ここでは重要な点を要約します。

各HTML要素のCSS重要度スコアは、0から開始し、次のように追加することで導き出されます。

  • インラインスタイル属性の場合1000

  • IDごとに100

  • 属性、クラス、または擬似クラスごとに10

  • 要素名または擬似要素ごとに1

これを用いて、次の構成の動作を説明します。

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

生成されたセレクター#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 テキスト

上記のケースでは、セレクター#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 テキスト

今度は別のテーブルスタイルを作成したので、セレクター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 テキスト

最終的に緑色のテキストになりました!

拡張性#

pandasのコアは、「高性能で使いやすいデータ構造」であり、今後もそうあり続けます。それを念頭に置いて、DataFrame.styleは2つの目標を達成することを願っています。

  • 対話的に使用するのが楽しく、「多くのタスクにとって十分」なAPIを提供すること

  • 専用のライブラリが構築できる基盤を提供すること

この上に素晴らしいライブラリを構築したら、お知らせください。そして、リンクします。

サブクラス化#

デフォルトのテンプレートがニーズに全く合わない場合は、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環境はそれを検索できる必要があります。

これで、そのカスタムスタイラーを使用できます。__init__はDataFrameを受け取ります。

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

私のテーブル

    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]:

拡張例

    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]:

別のタイトル

    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(ヘッダーをループ処理)
after_head_rows
tbody
before_rows
tr(データ行をループ処理)
after_rows
</table>
after_table

詳細については、GitHubリポジトリのテンプレートを参照してください。