5
3

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 3 years have passed since last update.

pandasでクリックできるリンクを表示する

Posted at

結論

次のようにして、指定した列をクリックできるリンクとして表示することができます。

df = pd.DataFrame({'name': ['google', 'pandas'], 'url':['https://www.google.com/?hl=ja', 'https://pandas.pydata.org/']})

def make_clickable(val):
    return '<a href="{}" target="_blank">{}</a>'.format(val,val)

df.style.format(formatter={'url': make_clickable})

スクリーンショット 2021-10-07 23.46.30.png

詳細

Colabなどnotebook環境で、URLを含むDataFrameを表示しようとすると、以下のようになると思います。

スクリーンショット 2021-10-07 23.16.50.png

できればこのURLをクリックして開けるようにしたいです。
stackoverflowに回答がありました。

次のコードは、上のstackoverflowからの引用です。

df = pd.DataFrame(['http://google.com', 'http://duckduckgo.com'])

def make_clickable(val):
    return '<a href="{}">{}</a>'.format(val,val)

df.style.format(make_clickable)

このコードを実行すると、次のように表示されます。

スクリーンショット 2021-10-09 10.43.25.png

クリックできるように見えますが、Colab上ではクリックしても反応しませんでした。(httpのせい?)
httpをhttpsに修正すると、クリックできるようになりましたが、出力セル内でページを開いてしまいました。

新しいタブでページを開く

そこで、関数make_clickableで返しているaタグにtarget="_blank"の属性を追加してあげます。
これで新しいタブでページを開くことができます。

def make_clickable(val):
    return '<a href="{}" target="_blank">{}</a>'.format(val,val)

列を指定する

次の例は複数の列を持つDataFrameの場合です。
同じ方法では、全ての列がクリックできるようになってしまいます。

スクリーンショット 2021-10-09 11.28.38.png

適用したい列はDataFrame.style.formatの引数formatterで指定できます。
辞書形式で列と関数を指定します。

df.style.format(formatter={'url': make_clickable})

スクリーンショット 2021-10-07 23.46.30.png

おわりに

DataFrame.style.formatでフォーマットを指定すると、デフォルトのフォーマットが崩れてしまうため、ここまでの例のように見た目が変わってしまいます。
必要に応じて、以下のドキュメントを参考にフォーマットを調整することができます。

また、今回の内容をまとめたColabを参考として添付しておきます。

5
3
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
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?