Pandas使列可单击并排序

问题描述 投票:1回答:1

我关注了这篇文章How to create a table with clickable hyperlink in 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")
python pandas clickable
1个回答
0
投票

我以前从未使用过样式,所以我可能是错的。根据我可以在Styling documentation中找到的内容,样式并不意味着定义DataFrame的默认HTML表示形式。使用样式的预期方式是每次需要应用给定的格式设置选项时调用DataFrame.style.format(),在这种情况下,将是:

df.sort_values(by='a').style.format({'a': make_clickable})

[我想从您的问题中,当您仅将DataFrame作为单元格的最后一行时,您想强制给定的列始终以给定的方式显示。您可以尝试以下两种解决方案。

解决方案1

我们可以为此定义一个快捷方式,如果我们需要一个更复杂的格式化策略,它可能特别方便:

def clickable_links(df):
    return df.style.format({'a': make_clickable})

然后简单地:

clickable_links(df.sort_values(by='a'))

解决方案2

另一个可行的解决方案(只是为了好玩)将自动使所有DataFrame的所有链接(名称为'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')

第二种解决方案的缺点是,每个DataFrame现在都将a列格式化为HTML输出中的链接。

解决方案2的详细信息

此解决方案的想法是修改默认情况下HTML的呈现方式。在笔记本中,每次单元格以DataFrame df结尾时,它都会自动调用df._repr_html_。我们可以使用它来修改默认行为。一种方法是简单地将函数pandas.DataFrame._repr_html_绑定到我们喜欢的函数。

您无法通过直接为给定实例绑定方法df._repr_html_来为单个DataFrame真正定义此行为,因为此修改不会传递给后代DataFrames。换句话说,由于df._repr_htmldf.sort_values(by='a')._repr_html是DataFrame的两个不同的实例,因此dfdf.sort_values(by='a')不同。他们不分享他们的方法。

[也许可以通过在切片/排序/对df进行任何转换时复制该方法来找到中间立场,但是编写起来可能会有些复杂。

© www.soinside.com 2019 - 2024. All rights reserved.