如何为pandas DataFrame中匹配指定字符串的单元格添加颜色样式
问题原因梳理
- 列名匹配错误:你的DataFrame只有
Visitor、Home两列存储球队名,样式函数却只作用于不存在的Visitor vs Home列,自然不会生效 - 匹配逻辑错误:你需要匹配的是包含球队前缀的单元格值,直接用
map做全等匹配会漏掉所有带额外内容的单元格(比如TOR Maple Leafs这类完整队名) - 样式导出逻辑错误:调用
df1.style.apply(styler)只是生成了样式对象,你还是用了原生DataFrame的to_html导出,样式完全没有被写入输出文件 - 函数语法错误:你贴的样式函数第一行定义有多余缩进,运行会直接抛出语法错误
可行解决方案
调整样式逻辑后直接通过样式对象导出HTML即可,完整可运行代码如下:
import pandas as pd # 原有过滤逻辑保持不变 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) # 优化后的样式函数 def styler(col): # 仅对存储球队名的两列生效 if col.name not in ['Visitor', 'Home']: return [''] * len(col) # 统一维护球队和对应背景色映射 team_color_map = { 'TOR': 'blue', 'MTL': 'red', 'VAN': 'green', 'CGY': 'orange', 'WPG': 'navy', 'EDM': 'gold', 'OTT': 'purple' } # 按前缀匹配获取对应背景色 style_list = [] for cell_value in col: bg_color = '' for team_prefix, color in team_color_map.items(): if cell_value.startswith(team_prefix): bg_color = f'background-color: {color};' break style_list.append(bg_color) return style_list # 生成带样式的HTML并导出文件 styled_html = df1.style.apply(styler).to_html(index=False) with open('schedule.html', 'w', encoding='utf-8') as f: f.write(styled_html)
可选优化建议
- 如果需要只高亮球队代码部分而非整个单元格,可以用
Styler.format配合<span>标签实现局部高亮 - 如果导出的HTML需要适配多端显示,可以额外写入通用表格CSS样式,优化排版效果
- 可以把球队前缀列表提为全局变量,统一维护过滤和样式逻辑,避免两边配置不一致
内容的提问来源于stack exchange,提问作者Rocky5
相关产品推荐
相关产品推荐

