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

如何同时为Pandas DataFrame应用两个Styler函数?

解决Pandas Styler同时应用多个样式函数的问题

你的问题出在每次调用df.style都会生成一个全新的Styler实例,前面对colors的样式设置没有被保留,后面调用df.style.applymap(colors2)创建的新实例覆盖了之前的,所以最终只有最后一个样式生效。

最优解决方法是链式调用Styler的方法,因为Styler的所有样式方法(比如applymap)都会返回自身实例,这样就能把多个样式操作叠加在一起:

import pandas as pd
df = pd.DataFrame(data=[[-100,500,400,0,222,222], [9000,124,0,-147,54,-56],[77,0,110,211,0,222], [111,11,-600,33,0,22,],[213,-124,0,-147,54,-56]])
df.columns = pd.MultiIndex.from_product([['x','y','z'], list('ab')])

def colors(i):
    if i > 0:
        return 'background: red'
    elif i < 0:
        return 'background: green'
    elif i == 0:
        return 'background: yellow'
    else:
        ''
def colors2(i):
    if i < 0:
        return 'background: red'
    elif i > 0:
        return 'background: green'
    elif i == 0:
        return 'background: yellow'
    else:
        ''
idx = pd.IndexSlice

# 链式调用两个applymap,将样式叠加
styled_df = df.style.applymap(colors, subset=pd.IndexSlice[:, idx['x','b']])\
                     .applymap(colors2, subset=pd.IndexSlice[:, idx[:, 'b']])

# 显示样式后的DataFrame
styled_df

注意事项

  • 如果两个样式函数的subset有重叠(比如这里colors的x,b列属于colors2的所有b列范围),后调用的样式会覆盖重叠区域的前一个样式。如果需要让x,b列保留colors的样式,需要调整colors2的subset,排除x,b:
    # 调整colors2的subset,只针对y、z列的b列
    styled_df = df.style.applymap(colors, subset=pd.IndexSlice[:, idx['x','b']])\
                         .applymap(colors2, subset=pd.IndexSlice[:, idx[['y','z'],'b']])
    

内容的提问来源于stack exchange,提问作者user18708380

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:40:39