Pandas сделать столбец кликабельным и отсортировать - PullRequest
2 голосов
/ 16 июня 2020

Я следил за этой публикацией Как создать таблицу с интерактивной гиперссылкой в ​​pandas и Jupyter Notebook для создания интерактивной ссылки в фрейме данных. Однако кажется, что каждый раз, когда я сортирую фрейм данных, гиперссылки go удаляются.

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")

1 Ответ

0 голосов
/ 17 июня 2020

Я никогда раньше не использовал стили, поэтому могу ошибаться. Согласно тому, что я могу найти в документации по стилю , стили не предназначены для определения представления 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

Другое жизнеспособное решение (просто для удовольствия) будет автоматически иметь все ссылки (столбцы с именем 'a'), доступные для щелчка для всех DataFrames:

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_ к функции, которая нам нравится.

На самом деле вы не можете определить это поведение для одного DataFrame, привязав метод df._repr_html_ непосредственно к данному экземпляру, потому что это изменение не будет передано в дочерние DataFrames. Другими словами, df._repr_html будет отличаться от df.sort_values(by='a')._repr_html, потому что df и df.sort_values(by='a') - это два разных экземпляра DataFrame. Они не делятся своими методами.

Может быть, можно найти золотую середину, скопировав метод при нарезке / сортировке / или применив какое-либо преобразование к df, но это, вероятно, будет немного сложнее написать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...