如何通过for循环为DataFrame不同列应用不同高亮规则?
Pandas Styler循环调用apply时高亮异常的问题解决
问题原因
这是Python闭包延迟绑定导致的问题:循环里定义的lambda不会立刻捕获当前循环的str_lst值,而是等到lambda实际执行时才去读取str_lst的当前引用。当循环结束后,str_lst已经指向了列表的最后一个元素["corge", "fred"],所以两次apply最终都用了这个值,导致两列都按最后一组规则高亮。
解决方案
方法1:给lambda添加默认参数强制捕获当前值
通过给lambda设置默认参数,让每次循环都把当前的str_lst值绑定到参数上,避开延迟绑定的坑:
for str_lst, subset in zip(str_lists, df.columns): print(str_lst, subset) styled_df.apply(lambda x, lst=str_lst: highlight_str(x, lst), subset=[subset])
方法2:用functools.partial提前绑定参数
借助functools.partial把str_lst和highlight_str提前绑定成新函数,确保每次循环使用的都是当前组的规则:
from functools import partial for str_lst, subset in zip(str_lists, df.columns): print(str_lst, subset) styled_df.apply(partial(highlight_str, str_lst=str_lst), subset=[subset])
效果验证
修改后运行代码,列A会按["foo", "bar"]高亮匹配项,列B按["corge", "fred"]高亮匹配项,和链式调用的预期效果完全一致。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

