我正在尝试将df1中与df3中的值匹配的任何字符串的字体颜色更改为红色并突出显示该行。我找不到有关更改字体颜色的任何信息。数据集是:
) and integer or boolean arrays are valid indice
我正在使用以下内容:
df1 = [ ‘i like to shop at store a.’ , ‘he likes to shop at the store b.’, ‘she is happy to shop at store c.’, 'we want to shop at the store d.']
df2 = [ ‘store a’, ‘store b’, ‘store c’, 'store d' ]
df3 = [ ‘like to’, ‘likes to shop’, ‘at store’ ]
输出应如下所示:
请帮忙!
答案 0 :(得分:1)
您可以有条件地格式化包含此文本的行或单元格,例如如下面的例子。我认为你不能用红色突出显示文本的部分内容(好吧,除非你想进行重新整理整个html的重要工作,我甚至不确定是否可行)。请参阅样式器documentation。
import pandas as pd
df1 = [ 'i like to shop at store a.' , 'he likes to shop at the store b.', 'she is happy to shop at store c.', 'we want to shop at the store d.']
df2 = [ 'store a', 'store b', 'store c', 'store d' ]
df3 = [ 'like to', 'likes to shop', 'at store' ]
myDataSet = list(zip(df1,df2))
df = pd.DataFrame(data = myDataSet, columns=['df1', 'df2'])
def in_statements(val):
for statement in df3:
if statement in val:
color = 'yellow'
break
else:
color = 'black'
return 'background-color: %s' % color
df = df.style.applymap(in_statements)
df
为什么要处理造型模糊呢? :)不仅仅是添加一个额外的列来提取有趣的文本? (如果不存在则为空白)
修改强> 每个请求,通过添加额外的列来实现没有样式限制的目标的方法:
def check(df):
df["Statements"] = ", ".join(
[x for x in df3 if x in df["df1"].to_string()])
return df
df = df.groupby("df1").apply(lambda dfx: check(dfx))
df
答案 1 :(得分:0)
您可以尝试使用css来设置数据框的样式。
以下是https://pandas.pydata.org/pandas-docs/stable/style.html
中的一些文字您可以使用DataFrame.style属性应用条件格式,即DataFrame的视觉样式,具体取决于其中的数据。这是一个返回Styler对象的属性,该对象具有格式化和显示DataFrames的有用方法。
使用CSS完成样式设置。你编写带有标量,数据框或系列的“样式函数”,并使用CSS"属性:值"返回类似索引的DataFrames或Series。配对值。这些函数可以递增地传递给Styler,Styler在渲染之前收集样式。
答案 2 :(得分:0)
就像@Ywapom所建议的那样,它可以在Jupyter Notebook中使用HTML格式完成。请检查他的答案。
import re
from IPython.display import HTML
def display_highlighted_words(df, keywords):
head = """
<table>
<thead>
""" + \
"".join(["<th> %s </th>" % c for c in df.columns])\
+ """
</thead>
<tbody>"""
for i,r in df.iterrows():
row = "<tr>"
for c in df.columns:
matches = []
for k in keywords:
for match in re.finditer(k, str(r[c])):
matches.append(match)
# reverse sorting
matches = sorted(matches, key = lambda x: x.start(), reverse=True)
# building HTML row
cell = str(r[c])
for match in matches:
cell = cell[:match.start()] +\
"<span style='color:red;'> %s </span>" % cell[match.start():match.end()] +\
cell[match.end():]
row += "<td> %s </td>" % cell
row += "</tr>"
head += row
head += "</tbody></table>"
display(HTML(head))
然后,用像这样的棕褐色示例DataFrame
df = pd.DataFrame([["Franco color Franco",1],
["Franco Franco Ciccio Franco",2],
["Ciccio span",3]], columns=["A", "B"])
display_highlighted_words(df, ["Franco", "Ciccio"])
结果如下。
上面的代码可以很容易地扩展,以使关键字向量可以像原始问题那样从数据集中的一列中选择。