lev lev - 1 month ago 9
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
Out[4]:
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
Out[7]:
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?

EDIT:
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:

pd.set_printoptions(max_colwidth=1000)

Answer

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.