非调试模式下DataFrame被误转Styler,报'Styler object has no attribute style'
Pandas Styler对象误判导致运行报错
实现的颜色标注函数
from datetime import datetime, timedelta import pandas as pd def apply_color_to_report(self, report_df, timeout): """ color dataframe based on column 'alarmColor' with styler return report_df Styler object """ def highlight_rows(row): return [f"background-color: {row.loc['alarmColor']}" for _ in row] def highlight_timeout(dt): now = datetime.now() return f"background-color: {'red' if dt < now - timedelta(hours=timeout) else None}" color_report_df = ( report_df.style.apply(highlight_rows, axis=1) .applymap(highlight_timeout, subset=[f"timeStamp [{timeout} hr timeout]"]) .hide(subset=["alarmColor"], axis="columns") ) return color_report_df
函数逻辑
- 借助
highlight_rows函数,根据alarmColor列的值为整行设置背景色 - 通过
highlight_timeout函数判断时间戳是否超出指定超时小时数,超出则将对应单元格背景设为红色 - 处理完成后隐藏
alarmColor列,返回Styler对象用于生成带格式的Excel文件
问题现象
- VSCode逐行调试场景:确认
report_df是标准DataFrame对象且拥有style属性,在调试终端执行代码可正常运行并导出Excel - 直接运行脚本场景:触发报错
'Styler object has no attribute style',此时report_df被错误识别为Styler对象而非DataFrame
环境信息
- IDE:VSCode
- Python版本:3.12.3(虚拟环境)
- pandas版本:2.2.2
- jinja2版本:3.1.3
排查与解决建议
- 检查函数调用链路:确认调用
apply_color_to_report时传入的report_df是否为原始DataFrame,避免将前一次调用返回的Styler对象重复传入 - 添加参数类型校验:在函数开头加入类型检查,提前拦截错误输入:
def apply_color_to_report(self, report_df, timeout): if not isinstance(report_df, pd.DataFrame): raise TypeError(f"参数report_df应为pd.DataFrame类型,实际传入{type(report_df).__name__}") # 原函数逻辑... - 排查上游代码修改:检查调用该函数前的代码,确认是否存在将
report_df赋值为Styler对象的操作(比如执行report_df = report_df.style.xxx后未重新赋值为原始DataFrame)
内容的提问来源于stack exchange,提问作者Kan-Jen Liu
相关产品推荐
相关产品推荐

