在pandas表中插入一个链接

lev*_*lev 30 python pandas ipython-notebook

我想在pandas表中插入一个链接(到一个网页),所以当它在ipython笔记本中显示时,我可以按链接.

我尝试了以下方法:

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
Run Code Online (Sandbox Code Playgroud)

但是网址只显示为文字.

我也尝试过使用ipython HTML对象:

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>
Run Code Online (Sandbox Code Playgroud)

但它只会显示对象的repr.

还有其他想法吗?

编辑:alko得到了正确的答案,只是想补充说,默认情况下单元格宽度是有限的,长html代码将被截断,即:

<a href="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0">xxx</a>
Run Code Online (Sandbox Code Playgroud)

将成为这样:

<a href="aaaaaaaaaaaaaaaaaaaaaa...
Run Code Online (Sandbox Code Playgroud)

并且无法正确显示.(即使文本xxx很短并且可以放在单元格中)

我通过设置绕过它:

pd.set_printoptions(max_colwidth=-1)
Run Code Online (Sandbox Code Playgroud)

alk*_*lko 46

我想你必须将整个pandas对象表示为html对象,即

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))
Run Code Online (Sandbox Code Playgroud)

对不起,现在手头没有IPython,无法检查输出是否正确.

  • 我注意到,对于有些长的网址,大熊猫"默默地"缩短了html,以便在单元格中显示"空白".这是一个解决方案:http://stackoverflow.com/q/26277757/621449 (10认同)

Cla*_*nga 7

由于版本 24 熊猫有一种本地方式来处理链接:https : //pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_html.html

这有效:

df["col"] = df["col"].apply( # insert links
            lambda x: "<a href='https://link{}'>{}</a>".format(
                re.findall("pattern", x)[0], x
            )
        )

df.to_html(
    render_links=True,
    escape=False,
)
Run Code Online (Sandbox Code Playgroud)


Jul*_*ian 6

如果您想避免缩短长网址的问题,您还可以显示具有唯一值或标准值的链接,即

df['Url'] = '<a href=' + df['Url'] + '><div>' + df['Name'] + '</div></a>'

df = df.to_html(escape=False)

# OR

df['Url'] = '<a href=' + df['Url'] + '><div>'Hello World'</div></a>'

df = df.to_html(escape=False)
Run Code Online (Sandbox Code Playgroud)