【Pandas超便利技】DataFrameに条件付きでスタイルを適用!「pandas.io.formats.style.Styler.apply」徹底解説

2024-05-16

pandas.io.formats.style.Styler.apply は、Pandas DataFrame のセル、行、列、または全体に CSS スタイルを適用するためのメソッドです。スタイルは、文字列形式の CSS プロパティ (例: "background-color: red; font-size: 16px") で指定します。

使い方

apply メソッドは、次の 3 つの引数を受け取ります。

  • func: スタイルを定義する関数。この関数は、DataFrame のセル、行、列、または全体を受け取り、適用する CSS スタイルを文字列形式で返す必要があります。
  • axis: スタイルを適用する軸。0 は行、1 は列、None は全体を意味します。
  • subset: スタイルを適用するセル、行、または列のサブセットを指定するオプションの引数。

次の例では、すべてのセルに赤色の背景色と太字のフォントを設定します。

import pandas as pd

df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], columns=['A', 'B', 'C'])

def style_all(data):
    return 'background-color: red; font-weight: bold;'

styled_df = df.style.apply(style_all)
print(styled_df)

出力:

<style>
  /* These styles are applied to every cell in the table. */
  td {
    background-color: red;
    font-weight: bold;
  }
</style>

<table>
<thead>
<tr>
<th></th>
<th>A</th>
<th>B</th>
<th>C</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<th>1</th>
<td>4</td>
<td>5</td>
<td>6</td>
</tr>
<tr>
<th>2</th>
<td>7</td>
<td>8</td>
<td>9</td>
</tr>
</tbody>
</table>

条件付きスタイル

apply メソッドを使用して、条件に基づいてスタイルを適用することもできます。次の例では、値が 5 より大きいセルを赤色で、値が 5 以下のセルを青色で表示します。

def style_cells(data):
    if data > 5:
        return 'background-color: red;'
    else:
        return 'background-color: blue;'

styled_df = df.style.apply(style_cells)
print(styled_df)

出力:

<style>
  /* Style for cells with value greater than 5. */
  .style-apply-0 {
    background-color: red;
  }

  /* Style for cells with value less than or equal to 5. */
  .style-apply-1 {
    background-color: blue;
  }
</style>

<table>
<thead>
<tr>
<th></th>
<th>A</th>
<th>B</th>
<th>C</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<th>1</th>
<td>4</td>
<td>5</td>
<td>6</td>
</tr>
<tr>
<th>2</th>
<td>7</td>
<td class="style-apply-0">8</td>
<td>9</td>
</tr>
</tbody>
</table>

より複雑なスタイル

apply メソッドを使用して、より複雑なスタイルを適用することもできます。たとえば、フォントサイズ、フォントファミリー、ボーダーなどを設定できます。

その他のメソッド

Styler クラスには、apply メソッド以外にも、セル、行、列、または全体にスタイルを適用するためのさまざまなメソッドがあります。これらのメソッドの詳細については、Pandas のドキュメントを参照してください。

pandas.io.formats.style.Styler.apply メソッドは、Pandas DataFrame に CSS スタイルを適用するための強力なツールです。このメソッドを使用して、データの可読性と理解しやすさを向上させることができます。



pandas.io.formats.style.Styler.apply のサンプルコード

以下のサンプルコードでは、df という名前の DataFrame を使用します。この DataFrame は次の内容を持つと仮定します。

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})

セルに条件付きでスタイルを適用

この例では、値が 5 より大きいセルを赤色で、5 以下のセルを青色で表示します。

def style_cells(data):
    if data > 5:
        return 'background-color: red;'
    else:
        return 'background-color: blue;'

styled_df = df.style.apply(style_cells)
print(styled_df)

出力:

<style>
  /* Style for cells with value greater than 5. */
  .style-apply-0 {
    background-color: red;
  }

  /* Style for cells with value less than or equal to 5. */
  .style-apply-1 {
    background-color: blue;
  }
</style>

<table>
<thead>
<tr>
<th></th>
<th>A</th>
<th>B</th>
<th>C</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<th>1</th>
<td>4</td>
<td>5</td>
<td>6</td>
</tr>
<tr>
<th>2</th>
<td>7</td>
<td>8</td>
<td>9</td>
</tr>
</tbody>
</table>

行にスタイルを適用

この例では、偶数行を灰色で、奇数行を白色で表示します。

def style_rows(row_index):
    if row_index % 2 == 0:
        return 'background-color: #f0f0f0;'
    else:
        return ''

styled_df = df.style.apply(style_rows, axis=1)
print(styled_df)

出力:

<style>
  /* Style for even rows. */
  .style-apply-0 {
    background-color: #f0f0f0;
  }
</style>

<table>
<thead>
<tr>
<th></th>
<th>A</th>
<th>B</th>
<th>C</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<th>1</th>
<td>4</td>
<td>5</td>
<td>6</td>
</tr>
<tr>
<th>2</th>
<td>7</td>
<td>8</td>
<td>9</td>
</tr>
</tbody>
</table>

列にスタイルを適用

この例では、A 列を太字で、B 列と C 列を標準の太さに設定します。

def style_columns(col_name):
    if col_name == 'A':
        return 'font-weight: bold;'
    else:
        return ''

styled_df = df.style.apply(style_columns, axis=0)
print(styled_df)

出力:

<style>
  /* Style for 'A' column. */
  .style-apply-0 {
    font-weight: bold;
  }
</style>

<table>
<thead>
<tr>
<th></th>
<th>A</th>
<th>B</th>
<th>C</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>1</td>
<td>4</td>
<td>7</td>
</tr>
<tr>
<th>1</th>
<td>2</td>
<td>5</td>
<td>8</td>
</tr>
<tr>
<th>2</th>
<td>3</td>
<td>6</td>
<td>9</td>
</tr>
</tbody>
</table>

全体にスタイルを適用

この例では、すべてのセルに 12px のフォントサイズを設定します。

def style_all():
    return 'font-size: 12px;'

styled_df = df.style.apply(style_all)
print(styled_df)

出力:

<style>
  /* Style for all cells. */
  td {
    font-size: 12px;
  }
</style>

<table>
<thead>
<tr>
<th></th>
<th>A</th>
<th>B</th>
<th>C</th>
</tr>
</thead>


pandas.Style で DataFrame をスタイリングするその他の方法

色付け

  • background_color プロパティを使用して、セルの背景色を設定できます。
  • color プロパティを使用して、セルのテキストの色を設定できます。
  • map メソッドを使用して、値に基づいてセルに色を割り当てることができます。

例:

import pandas as pd

df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], columns=['A', 'B', 'C'])

styled_df = df.style.background_color(cmap='coolwarm')
print(styled_df)

配置

  • text-align プロパティを使用して、セルのテキスト配置を設定できます。
  • vertical-align プロパティを使用して、セルの垂直方向の配置を設定できます。

例:

styled_df = df.style.set_alignment('center')
print(styled_df)

ボーダー

  • border プロパティを使用して、セルの境界を設定できます。
  • border-color プロパティを使用して、セルの境界の色を設定できます。

例:

styled_df = df.style.border(border='1px solid black')
print(styled_df)

書式

  • number_format プロパティを使用して、数値の書式を設定できます。
  • precision プロパティを使用して、小数点以下の桁数を設定できます。

例:

styled_df = df.style.number_format(precision=2)
print(styled_df)

テキスト装飾

  • font-size プロパティを使用して、セルのフォントサイズを設定できます。
  • font-family プロパティを使用して、セルのフォントファミリーを設定できます。

例:

styled_df = df.style.set_properties(font_size=14, font_family='Arial', font_weight='bold')
print(styled_df)

ワードラッピング

  • white-space プロパティを使用して、セルのテキストの折り返しを設定できます。

例:

styled_df = df.style.set_properties(white_space='normal')
print(styled_df)

画像

  • display_images プロパティを使用して、セルに画像を表示できます。

例:

import matplotlib.pyplot as plt

plt.figure(figsize=(2, 2))
plt.plot([1, 2, 3], [4, 5, 6])
plt.savefig('image.png')

styled_df = df.style.set_properties(display_images=[('image.png', 1, 1)])
print(styled_df)

HTML コード

  • html プロパティを使用して、セルに任意の HTML コードを挿入できます。

例:

styled_df = df.style.set_properties(html='<b>This text is bold.</b>')
print(styled_df)

テンプレート

  • template_file プロパティを使用して、HTML テンプレートファイルを指定できます。

例:

styled_df = df.style.set_template_file('template.html')
print(styled_df)

カスタマイズ CSS

  • use_to_latex メソッドを使用して、DataFrame を LaTeX 形式に変換できます。
  • to_html メソッドを使用して、DataFrame を HTML 形式に変換できます。
  • 生成された HTML または LaTeX コードをカスタマイズして、さらに詳細なスタイル設定を行うことができます。

これらの方法はほんの一例です。Styler クラスには、他にも多くのメソッドとプロパティがあります。詳細については、Pandas のドキュメントを参照してください。

この回答が、