我关注了这篇文章 如何在pandas & Jupyter Notebook中创建具有可点击超链接的表格,以在数据帧中创建可点击的链接。但是,似乎每当我对数据帧进行排序时,超链接都会消失。
df = pd.DataFrame(['http://google.com', 'http://duckduckgo.com'], columns=["a"])
def make_clickable(val):
return '<a href="{}">{}</a>'.format(val,val)
df.style.format(make_clickable)
这将显示不可单击的链接:
df.sort_values(by="a")
我以前从未使用过样式,所以我可能是错的。根据我在样式文档中可以找到的内容,样式不是用于定义数据帧的默认 HTML 表示形式。使用样式的预期方法是在每次需要应用给定格式选项时调用DataFrame.style.format()
,在这种情况下,这将是:
df.sort_values(by='a').style.format({'a': make_clickable})
从您的问题中,我想您想强制给定列始终以给定的方式显示,当您只是将数据帧作为单元格的最后一行时。您可以尝试以下两种解决方案。
解决方案 1
我们可以为此定义一个快捷方式,如果我们需要更复杂的格式化策略,它会特别方便:
def clickable_links(df):
return df.style.format({'a': make_clickable})
然后简单地:
clickable_links(df.sort_values(by='a'))
解决方案 2
另一个可行的解决方案(只是为了好玩(是自动为所有数据帧单击所有链接(名称为'a'
的列(:
def format_all_html_repr(format_options):
pd.DataFrame._repr_html_ = lambda self: self.style.format(format_options).render()
format_all_html_repr({'a': make_clickable})
df = pd.DataFrame(['http://google.com', 'http://duckduckgo.com'], columns=['a'])
然后,我们不需要像解决方案1中那样明确:
df.sort_values(by='a')
第二种解决方案的缺点是,每个数据帧现在都会a
列格式化为HTML 输出中的链接。
有关解决方案 2 的详细信息
此解决方案的想法是修改默认情况下呈现 HTML 的方式。在笔记本中,每次单元格以数据帧结尾时df
它都会自动调用df._repr_html_
。我们可以使用它来修改默认行为。一种方法是简单地将函数pandas.DataFrame._repr_html_
绑定到我们喜欢的函数。
您无法通过直接为给定实例绑定方法df._repr_html_
来真正为单个数据帧定义此行为,因为此修改不会传递给后代数据帧。换句话说,df._repr_html
与df.sort_values(by='a')._repr_html
不同,因为df
和df.sort_values(by='a')
是数据帧的两个不同实例。他们不分享他们的方法。
也许可以通过在切片/排序/或对df
应用任何转换时复制方法来找到中间立场,但这编写起来可能会有点复杂。