ギークなエンジニアを目指す男

機械学習系の知識を蓄えようとするブログ

【小ネタ】ipywidgetsを使ってデータフレームのheaderを固定してデータを表示する

f:id:taxa_program:20190911235410p:plain

こんばんは。takapy(@takapy0210)です。
今日はpythonの小ネタです。

サマリ

下記のように、headerを固定しながら一覧をスクロールすることができます。 f:id:taxa_program:20190911235154g:plain

手順

ipywidgetsのインストールとjupyterの設定

下記コマンドで設定を行います。 自分は普段jupyter labを使用しているので、下記コマンドを使用しましたが、jupyter notebookを利用している方は、2つ目のコマンドは不要だと思います。

$ pip install ipywidgets
$ jupyter labextension install @jupyter-widgets/jupyterlab-manager
$ jupyter nbextension enable --py --sys-prefix widgetsnbextension

参照:

ipywidgets.readthedocs.io

コード

今回はKaggleのTitanicデータセットを使って、ipywidgetsを使ってみます。

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

# 読み込み
train = pd.read_csv('train.csv')

ご存知の方も多いと思いますが、下記のようなデータになっています。 f:id:taxa_program:20190911233918p:plain

freeze_headerという関数を定義して、そこにデータフレームを渡します。

from ipywidgets import interact, IntSlider
from IPython.display import display

def freeze_header(df, num_rows=30, num_columns=10, step_rows=1, step_columns=1):
    @interact(last_row=IntSlider(min=min(num_rows, df.shape[0]),
                                 max=df.shape[0],
                                 step=step_rows,
                                 description='rows',
                                 readout=False,
                                 disabled=False,
                                 continuous_update=True,
                                 orientation='horizontal',
                                 slider_color='purple'),
              last_column=IntSlider(min=min(num_columns, df.shape[1]),
                                    max=df.shape[1],
                                    step=step_columns,
                                    description='columns',
                                    readout=False,
                                    disabled=False,
                                    continuous_update=True,
                                    orientation='horizontal',
                                    slider_color='purple'))
    def _freeze_header(last_row, last_column):
        display(df.iloc[max(0, last_row-num_rows):last_row,
                        max(0, last_column-num_columns):last_column])

# headerを固定してデータを表示
freeze_header(df=train, num_rows=10, num_columns=20)

すると、下記のようにスライドバーが表示され、indexとheaderを固定しながら、上下左右にスクロースすることができます。

f:id:taxa_program:20190911234126p:plain

Titanicデータは、カラム数が多くないのであまり恩恵はありませんが、下記のようなデータセットの場合には少し恩恵がありそうです。

# 200 * 2000のデータフレームを生成
df = pd.DataFrame(pd.np.random.RandomState(seed=0).randint(low=0, high=100, size=[200, 2000]))

# headerを固定してデータを表示
freeze_header(df=df, num_rows=10, num_columns=40)

f:id:taxa_program:20190911235017g:plain

最後に

データ分析する際に使用するデータは、行数や列数が膨大になることが多いと思います。
そんな中で、indexやheaderを固定してデータを傍観する際には役立つのではないでしょうか。