我正在处理一个输出到 html 文件的数据框。我想为某些字符串添加颜色:
df1 = df1[(
df1['Visitor'].str.contains('^TOR|^MTL|^CGY|^WPG|^VAN|^EDM|^OTT', na=False)
) | (df1['Home'].str.contains('^TOR|^MTL|^CGY|^WPG|^VAN|^EDM|^OTT', na=False))]
df1.fillna('', inplace=True)
df1.to_html('schedule.html', index=False)
上面的代码删除了不包含任何列出的团队的所有行。我想为字符串留下的行添加颜色。例如,'TOR'
将为蓝色。
正如在另一个线程中看到的,这是我尝试过的,但没有任何改变:
def styler(col):
if col.name != 'Visitor vs Home':
return [''] * len(col)
bg_color = col.map({
'TOR': 'blue',
'MTL': 'red',
'VAN': 'green',
}).fillna('')
return 'background-color:' + bg_color
df1.style.apply(styler)
非常欢迎任何提示或建议。
谢谢!
最佳答案
Series.map
只能用于精确字符串匹配。如果需要测试字符串包含,请使用 str.contains
具有适当的模式。
然后我们可以使用np.select
允许将图案映射到颜色。最后,我们可以利用 Styler.apply
的 subset
参数仅设置特定列的样式,而不必检查传入的每列的名称:
def color_col(col):
return np.select(
[col.str.contains('TOR', na=False),
col.str.contains('MTL', na=False),
col.str.contains('VAN', na=False)],
['background-color: blue',
'background-color: red',
'background-color: green'],
default=''
).astype(str)
df.style.apply(color_col, subset=['Visitor vs Home'])
我们还可以进一步参数化我们的样式函数,以便我们可以传递图案和相应颜色的字典:
def color_col(col, pattern_map, default=''):
return np.select(
[col.str.contains(k, na=False) for k in pattern_map.keys()],
[f'background-color: {v}' for v in pattern_map.values()],
default=default
).astype(str)
df.style.apply(color_col,
pattern_map={'TOR': 'blue',
'MTL': 'red',
'VAN': 'green'},
subset=['Visitor vs Home'])
两个选项都会产生:
示例数据和导入:
import numpy as np
import pandas as pd
df = pd.DataFrame({
'Visitor': ['TOR', 'MTL', 'VAN', 'WPG', 'EDM'],
'Home': ['CGY', 'WPG', 'OTT', 'TOR', 'MTL'],
'Visitor vs Home': ['String with TOR',
'String with MTL',
'String with VAN',
'String with no match',
np.NaN]
})
关于python - 按字符串向 pandas 数据框添加颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69667301/