如何同时为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
相关产品推荐
相关产品推荐

