导出为HTML的pandas DataFrame如何应用多个条件格式化规则?
错误根因
你调用df.apply(style_red_date, subset=['Date'])时,apply方法会将整列(Series对象)传入style_red_date函数,函数内v < dt.datetime.now().date()是拿整个Series和单个日期做比较,pandas无法直接判断一整组值的布尔结果,因此抛出歧义错误。
解决方案
你的两个样式函数都是基于单个单元格的值判断样式,统一使用applymap(逐单元格处理方法)应用样式即可,Styler本身完全支持叠加多条样式规则后导出HTML。
修正后的样式应用代码如下:
# 建议单独声明Styler对象,避免覆盖原始DataFrame df_styler = df.style.applymap(style_negative, subset=['Number']) df_styler = df_styler.applymap(style_red_date, subset=['Date'])
也可以直接写成链式调用,逻辑更清晰:
html = ( df.style # 叠加多条样式规则 .applymap(style_negative, subset=['Number']) .applymap(style_red_date, subset=['Date']) .format({'Number':"{:.2f}"}) .set_properties(**{'font-size':'11pt'}) .hide(axis='index') # 新版本pandas推荐用hide(axis='index')替代已弃用的hide_index() .render() )
补充说明
Styler中apply和applymap的适用场景:
applymap():逐单元格传入单个值到样式函数,适合按单元格值独立判断样式的场景,就是你当前的需求类型apply():逐行/逐列传入完整Series到样式函数,适合需要整行/整列对比判断的场景,比如标记整行的最大值、最小值
修改后即可正常生成同时满足两个标红规则的HTML表格,插入到Outlook邮件正文中样式会正常生效。
内容的提问来源于stack exchange,提问作者Witherfield
相关产品推荐
相关产品推荐

