You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何为DataFrame对应Excel单元格按特定值设置背景色?

Python中如何为DataFrame对应Excel单元格按特定值设置背景色?

嘿,我发现你的问题出在样式应用后没有正确保存上!你调用了df3.style.applymap(cond_formatting),但这个方法返回的是一个带有样式的Styler对象,并没有修改原来的df3。你之后直接用原DataFrame的to_excel方法保存,自然不会带上样式啦。

解决方法

你需要把样式应用后的Styler对象保存下来,然后用它的to_excel方法导出Excel,而不是原DataFrame的方法。具体修改如下:

  1. 先把样式应用结果赋值给一个变量:
# 应用样式并保存Styler对象
styled_df = df3.style.applymap(cond_formatting)
  1. 用这个styled_df来导出Excel,同时保留你的freeze_panes设置:
# 保存带样式的Excel文件
styled_df.to_excel(file_name, freeze_panes=(1, 0))

修改后的完整代码片段

我把你的代码调整后,关键部分是这样的:

def cond_formatting(x):
    if x == 'OK':
        return 'background-color: lightgreen'
    elif x == 'NO':
        return 'background-color: red'
    else:
        return None
    
# 你的DataFrame处理逻辑保持不变
print(pd.merge(df, df2, left_on='uniquefield', right_on='uniquefield2', how='left').drop('uniquefield2', axis=1))
df3 = df.merge(df2, left_on='uniquefield', right_on='uniquefield2', how='left').drop(['uniquefield2', 'tournament2', 'home2', 'away2', 'result2'], axis=1) 
df3 = df3[["home","away","scorehome","scoreaway","best_bets","oddtwo","oddthree","htresult","shresult","result","over05ht","over15ht","over05sh","over15sh","over05","over15","over25","over35","over45","goal","esito","tournament","uniquefield"]]
df3 = df3.sort_values('best_bets')

# 重点:保存Styler对象
styled_df = df3.style.applymap(cond_formatting)

# determining the name of the file
file_name = camp + '_Last_20' + '.xlsx'
 
# 用Styler对象导出Excel,而不是原df3
styled_df.to_excel(file_name, freeze_panes=(1, 0))
print('Tournament is written to Excel File successfully.')

额外注意点

  • 如果你不需要导出DataFrame的索引,可以在to_excel里加上index=False参数,比如styled_df.to_excel(file_name, freeze_panes=(1, 0), index=False)
  • 确保你的pandas版本是较新的(比如1.3.0及以上),避免Styler.to_excel方法出现兼容性问题

这样修改后,Excel里的单元格就会根据值显示对应的背景色啦!

备注:内容来源于stack exchange,提问作者Marci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:08:05