lev lev - 15 days ago 6
Python Question

Insert a link inside a pandas table

I'd like to insert a link (to a web page) inside a pandas table, so when it is displayed in ipython notebook, I could press the link.

I tried the following:

In [1]: import pandas as pd

In [2]: df = pd.DataFrame(range(5), columns=['a'])

In [3]: df['b'] = df['a'].apply(lambda x: 'http://example.com/{0}'.format(x))

In [4]: df
a b
0 0 http://example.com/0
1 1 http://example.com/1
2 2 http://example.com/2
3 3 http://example.com/3
4 4 http://example.com/4

but the url is just displayed as text.

I also tried using ipython HTML object:

In [5]: from IPython.display import HTML

In [6]: df['b'] = df['a'].apply(lambda x:HTML('http://example.com/{0}'.format(x)))

In [7]: df
a b
0 0 <IPython.core.display.HTML object at 0x0481E530>
1 1 <IPython.core.display.HTML object at 0x0481E770>
2 2 <IPython.core.display.HTML object at 0x0481E7B0>
3 3 <IPython.core.display.HTML object at 0x0481E810>
4 4 <IPython.core.display.HTML object at 0x0481EA70>

but it will only display the repr of the object.

Any other ideas?

alko got the right answer, just wanted to add that the cell width is limited by default, and long html code will be truncated, ie:

<a href="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0">xxx</a>

will become this:

<a href="aaaaaaaaaaaaaaaaaaaaaa...

and won't be displayed correctly.
(even though the text xxx is short and can fit in the cell)

I've bypassed it by setting:



I suppose you have to represent whole pandas object as html object, that is

In [1]: from IPython.display import HTML

In [2]: df = pd.DataFrame(list(range(5)), columns=['a'])

In [3]: df['a'] = df['a'].apply(lambda x: '<a href="http://example.com/{0}">link</a>'.format(x))

In [4]: HTML(df.to_html(escape=False))

Sorry, now don't have IPython at hand, and can't check whether output is correct.