如何为pandas DataFrame单元格内的部分字符串设置颜色
实现原理
pandas Styler的applymap(高版本pandas已更名为map)方法是给整个单元格节点添加CSS规则,只能控制整格文本的统一样式,无法精准选中单元格内的部分文本,因此原有逻辑会把Name列整段内容全部标红。
要实现单元格内部分文本着色,核心思路是给需要加样式的文本片段单独包裹带内联样式的HTML标签,配置Styler渲染时不转义这些HTML标签即可达到效果。
实现代码
import pandas as pd def colorize_target_segment(text): # 按第一个空格拆分出名字和目标着色的姓氏部分,可根据自身需求修改匹配逻辑 parts = text.split(maxsplit=1) if len(parts) < 2: return text first_name, last_name = parts # 给目标片段套红色样式的span标签 return f"{first_name} <span style='color: red;'>{last_name}</span>" # 构造示例数据 data = { 'Name' : ['Martha BR', 'Bran dffd', 'Rob eqr', 'Georgia fdaf'], 'Maths' : [87, 91, 97, 95], 'Science' : [83, 99, 84, 76] } df = pd.DataFrame(data) # 仅对Name列应用自定义文本格式化,关闭HTML转义让内嵌样式生效 styled_df = df.style.format( formatter={'Name': colorize_target_segment}, escape=False ) # Jupyter环境直接输出styled_df即可看到效果,导出为HTML可使用styled_df.to_html("output.html")
补充说明
- 该方案仅适用于支持HTML渲染的场景,比如Jupyter类环境、导出HTML文件;如果需要导出带部分着色的Excel文件,需要用openpyxl等库单独操作单元格富文本,该HTML方案不生效。
- 如果着色目标不是空格后的姓氏,只需要修改
colorize_target_segment里的文本匹配逻辑,找到目标片段后包裹对应样式的span标签即可,支持同时给不同片段加不同颜色、字体粗细等样式。 - 数值列不要套用这类HTML格式化逻辑,否则会破坏数值类型的后续样式计算(比如色阶、数据条、条件格式等)。
内容的提问来源于stack exchange,提问作者brungesh
相关产品推荐
相关产品推荐

