выделите определенные слова в фрейме данных Pandas HTML

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я хочу выделить определенные слова во фрейме данных. Мои коды приведены ниже, проблема, с которой я сталкиваюсь, заключается в том, что он выделяет только первые слова из «selected_ text», что в данном случае является экономией, и не может выделить другие слова, даже если они присутствуют в тексте. Как мы можем изменить его таким образом, чтобы выделить все слова, если они присутствуют в тексте? Во-вторых, в настоящее время я получаю только одно слово в столбце «существующий». Можем ли мы получить более одного слова, если они присутствуют в столбце «body_text»? и также выделите их.

 import pandas as pd
from IPython.display import display, Markdown, Latex, HTML
df =pd.read_csv("/content/df_eup.csv")
df.head(1)
  

введите описание изображения здесь

 df['body_text'].isnull().sum()
df.dropna(subset=['body_text'], inplace=True)
list_exist = []
selected_words=["economy", "recession", "unemployment", "depression","inflation", "covid19","virus"," bank"]
for index, row in df.iterrows():
    word = selected_words[0]
    i = 0
    while (word not in row['body_text'] and i < 7 ):
        
        i  =1
        word = selected_words[i]
    if i<7:
        list_exist.append(selected_words[i])
    else:
        list_exist.append("not_exist")
df["existing"]=list_exist

def highlight_selected_text(row):
    text = row["body_text"]
    selected_text = ["economy", "recession", "unemployment", "depression","inflation", "covid19","virus","bank"]
    ext = row["existing"]

    color = {
        "economy": "red",
        "recession": "red",
        "unemployment": "red",
        "depression": "red",
        "inflation": "red",
        "covid19": "red",
        "virus" : "red",
        "bank": "red",
        "not_exist": "black"
        
    }[ext]

    highlighted = f'<span style="color: {color}; font-weight: bold">{ext}</span>'
    
    
    
    return text.replace(selected_text[0] or selected_text[1] or selected_text[2] or selected_text[3] or selected_text[4]or selected_text[5]or selected_text[6]or selected_text[7], highlighted)
df["highlighted"] = df.apply(highlight_selected_text, axis=1)


display(HTML(df.sample(30).to_html(escape=False)))
  

Пример вывода для выбора более слов (для второй части вопроса)
введите описание изображения здесь

Ответ №1:

Попробуйте получить значение dict внутри строки f:

 def highlight_selected_text(row):
    text = row["body_text"]
    ext = row["existing"]
    color = {
        "economy": "red",
        "recession": "red",
        "unemployment": "red",
        "depression": "red",
        "inflation": "red",
        "covid19": "red",
        "virus" : "red",
        "bank": "red",
        "not_exist": "black"
    }

    for k, v in color.items():
        text = text.replace(k, f'<span style="color: {v}; font-weight: bold">{k}</span>')

    return text
  

Комментарии:

1. Спасибо, я обновил, но теперь получаю эту ошибку TypeError: строковые индексы должны быть целыми числами

2. Большое спасибо!! Александра, я обновил, но это не решило проблему выделения

3. О, попробуйте также заменить return text.replace(selected_text[0] or selected_text[1] or selected_text[2] or selected_text[3] or selected_text[4]or selected_text[5]or selected_text[6]or selected_text[7], highlighted) на return text.replace(ext, highlighted)

4. Большое вам спасибо!! Это сработало. Первая проблема выделения решена. Не могли бы вы помочь мне со вторым? Я хочу выделить больше слов в столбце «существующий», если они присутствуют в тексте. В настоящее время я получаю только одно слово.

5. Не могли бы вы привести пример результата, которого вы хотите достичь?