Life is Like a Boat

忘備録や投資日記、プログラミングに関するメモやtipsなど

Pandasデータフレームのセルに色をつけたい

PandasのデータフレームをJupyter Notebook上でテーブル表示する際、セルに色をつけたいケースがあります。

具体的にはこんな風にしたい時です。

f:id:nerimplo:20190911105839p:plain

このテーブルは TOPIXコア30採用銘柄の毎月のベストとワーストパフォーマーを色付けしたものです。 例えば、今年の4月の騰落率でみると、任天堂が+17.10%でコア30銘柄中のベストパフォーマー、武田薬が-8.74とワーストになっています。

セルに色をつける事ができるとは聞いた事がありましたが、実際にどうするのか知らなかったので調べてみました。

まず、Pandas公式にはStylingを使うとあります。

pandas.pydata.org

よく読むと、やりたいことはカラム毎(毎月)に最大値、最小値を見つける関数を適用するのようです。

コードにすると下記のようになります。

  • データフレームの1つのカラムを指すデータ構造であるSeriesに対して、series.max()で最大(小)値を見つけ、最大(小)値でなければtrueで色付け(background-color)、そうでなければ何もしないという関数を作る。
def highlight_highest_on_each_month(series):
    is_max = series == series.max()
    return ['background-color: #FC6C4D' if v else '' for v in is_max]

def highlight_lowest_on_each_month(series):
    is_min = series == series.min()
    return ['background-color: #5B60F8' if v else '' for v in is_min]

is_max = series == series.max()の部分が直感的にわからない感じがしますが、

is_max = series == series.max()
print(is_max)

でboolのSeriesを生成しています。

  • メソッドチェーンを使ってそれぞれの関数をapplyしてあげます。
df = df.style.apply(highlight_highest_on_each_month).apply(highlight_lowest_on_each_month)
  • htmlファイルとして書き出します。
with open("df.html","w", encoding='utf-8') as f:
    f.write(df.render())

書き出したあとは、cssを調整するなどして見栄えを整えてあげればいいと思います。

参考記事

stackoverflow.com

PythonユーザのためのJupyter[実践]入門

PythonユーザのためのJupyter[実践]入門