前面我们学习了通过 pandas 来处理并格式化输出 Excel 的基本方法。今天,我们将通过一个具体的实例,深入探讨如何利用其 style 功能,实现类似 Excel 中“条件格式”的效果,让数据根据特定规则高亮显示。
想象一下这个场景:在月度费用报表中,我们希望一眼就能看出哪些部门超支,哪些部门节约。需求很明确:将超支的金额标红,节约的金额标绿,同时,超支比例的不同等级也用颜色加以区分。
话不多说,我们直接通过代码来实现。
一、准备基础数据
首先,我们使用 pandas 创建一个模拟的数据集。
import pandas as pd
# 创建示例数据
data = {
'部门': ['研发部', '市场部', '财务部', '人事部', '运营部'],
'预算': [50000, 30000, 20000, 15000, 25000],
'实际支出': [55000, 28000, 22000, 14000, 30000],
'差额': [5000, -2000, 2000, -1000, 5000],
'超支比例': [0.10, -0.07, 0.10, -0.07, 0.20]
}
df = pd.DataFrame(data)
这段代码创建了一个包含部门预算、实际支出、差额和超支比例的 DataFrame。当然,你也可以先从 Excel 文件读取数据,处理逻辑是相同的。我们的核心目标,就是对 df 这个数据集进行可视化样式渲染。
二、定义样式函数
pandas 的样式功能允许我们定义函数来为单元格应用 CSS 样式。这里我们需要两个函数,分别处理“差额”和“超支比例”列。
1. 高亮显示差额
这个函数判断“差额”的正负,为正(超支)则应用红色背景和文字,为负(节约)则应用绿色样式。
# 定义差额颜色样式
def highlight_diff(val):
if val > 0:
return 'background-color: #ffcccc; color: red; font-weight: bold'
elif val < 0:
return 'background-color: #ccffcc; color: green; font-weight: bold'
return ''
2. 高亮显示超支比例
这个函数根据超支比例的大小,返回不同的文字颜色。比例超过10%用红色粗体,0-10%之间用橙色,节约(比例为负)则用绿色。
# 定义超支比例样式
def highlight_ratio(val):
if val > 0.1:
return 'color: red; font-weight: bold'
elif val > 0:
return 'color: orange'
else:
return 'color: green'
这两个函数就是我们的样式规则“引擎”,它们会返回符合 CSS 语法的字符串。
三、应用样式并导出Excel
接下来,我们使用 DataFrame 的 .style 属性,将上面定义的函数应用到对应的列,并进行一些额外的表格美化,最后导出为 Excel 文件。
# 应用样式
styled_df = df.style \
.applymap(highlight_diff, subset=['差额']) \
.applymap(highlight_ratio, subset=['超支比例']) \
.format({
'预算': '¥{:,.0f}',
'实际支出': '¥{:,.0f}',
'差额': '¥{:,.0f}',
'超支比例': '{:.2%}'
}) \
.set_table_styles([
{'selector': 'th', 'props': [
('background-color', '#4a90e2'),
('color', 'white'),
('font-weight', 'bold'),
('padding', '8px'),
('text-align', 'center')
]},
{'selector': 'td', 'props': [
('padding', '6px'),
('border', '1px solid #ddd')
]}
]) \
.set_caption('部门费用报表 - 超支分析')
# 保存为Excel
styled_df.to_excel('费用报表_格式化.xlsx',
engine='openpyxl', index=False)
print("格式化完成!文件已保存为:费用报表_格式化.xlsx")
这段代码做了以下几件事:
.applymap(): 将样式函数映射到指定的列(subset 参数)。
.format(): 设置数字的显示格式,例如为金额添加货币符号,将比例转换为百分比。
.set_table_styles(): 设置整个表格的 CSS 样式,如表头背景色、单元格内边距和边框。
.to_excel(): 将带有样式的 DataFrame 保存为 Excel 文件。注意,需要指定 engine='openpyxl' 来支持样式写入。
最终效果预览:
- 差额列:超支的单元格显示为红色背景,节约的显示为绿色背景。
- 超支比例列:比例 > 10% 显示为红色粗体,0-10% 显示为橙色,节约的显示为绿色。
- 整体表格:拥有美观的表头和清晰的单元格边框。

四、总结:Pandas样式应用三步法
这是 pandas 的 style 组件一个非常实用的场景——高亮显示需要重点标注的数据。
你可以将整个流程总结为 “三步走”:
- 定义格式函数 —— 使用
if/else 逻辑判断,返回对应的 CSS 样式字符串。
- 调用格式函数 —— 使用
df.style.applymap() 方法,将函数应用到目标列或整个数据框。
- 美化表格(可选) —— 使用
.set_table_styles()、.format() 等方法,进一步优化表格的显示效果。
掌握这个方法,你就能轻松实现各种基于条件的表格可视化,让生成的 Excel 报告更加专业、直观。pandas 的 Pandas 数据处理能力结合其样式功能,在 Python 自动化办公中潜力巨大。

方老师说:
这个方法你掌握了吗?试着改造一下你手头的数据报告吧。如果在实践过程中遇到任何问题,或者有更酷的样式想法,都欢迎在 云栈社区 的技术板块进行交流探讨。
