9
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

pandasが出力するHTMLテーブルを高機能にする

Last updated at Posted at 2023-06-15

pandasのデータをHTMLで出力したいときってありますよね。
Excelよりもブラウザのほうが軽快なので、ちょっと見るだけならHTMLのほうが早いです。
ですが、以下のようなコードが出力するHTMLは全然イケていません。

import pandas as pd

URL = "https://opendata.ecdc.europa.eu/covid19/casedistribution/csv" # 世界各国別データ(ECDE オープンデータ)
df = pd.read_csv(URL).iloc[:100, :]
df.to_html('hoge.html')

出力したHTMLファイルをブラウザで開くとこんな感じ

before.png

装飾が全くなく、無骨すぎます。

そこで、こちらの記事で紹介されていたJavaScriptのライブラリ-DataTables-の力を借りて、高機能かつ見栄えをよくします。
一例ですが、以下のような関数を定義して使います。

def write_html(df, output):
    scripts = """
    <link href="https://cdn.datatables.net/v/dt/jq-3.6.0/dt-1.13.4/datatables.min.css" rel="stylesheet"/>
    <script src="https://cdn.datatables.net/v/dt/jq-3.6.0/dt-1.13.4/datatables.min.js"></script>
    <script>$(document).ready(function() {$('.my-table').DataTable({});})</script>
    """

    html = df.to_html(classes='my-table')
    html = scripts + html
    with open(output, mode='w') as f:
        f.write(html)

write_html(df, 'fuga.html')

ポイントはdf.to_htmlメソッドではHTMLファイルを出力しないことです。
テーブルタグのみの文字列を作り、その文字列の先頭にDataTablesを読み込むタグを追加したあと、ファイルに出力します。

これだけで画像のようなフィルター、ソート、ページング機能がついた整ったテーブルになります。ちなみにShiftを押しながらカラム名を押すことで、複数列のソートができます。超便利ですね。

after1.png

最後に私のおすすめ設定を晒しておきます。
script変数を以下に変更することで、テーブルが見やすくなり、またフィルター機能も強化されます。

    scripts = """
    <link href="https://cdnjs.cloudflare.com/ajax/libs/foundation/6.4.3/css/foundation.min.css" rel="stylesheet"/>
    <link href="https://cdn.datatables.net/v/zf/jq-3.6.0/dt-1.13.4/b-2.3.6/b-html5-2.3.6/date-1.4.1/fh-3.3.2/sb-1.4.2/datatables.min.css" rel="stylesheet"/>
 
    <script src="https://cdn.datatables.net/v/zf/jq-3.6.0/dt-1.13.4/b-2.3.6/b-html5-2.3.6/date-1.4.1/fh-3.3.2/sb-1.4.2/datatables.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/foundation/6.4.3/js/foundation.min.js"></script>

    <script>
        $(document).ready(function() {$('.my-table').DataTable({
            select: true,
            displayLength: 25,
            buttons: ['copy'],
            fixedHeader: true,
            dom: 'iQrtBlp',
        });})
    </script>
    """

after2.png

どうぞお試しあれ^^

9
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?