Pandas对已设置样式的DataFrame排序时报KeyError问题排查
错误根因
你当前的代码执行顺序和操作逻辑不符合pandas Styler的设计规范,具体问题出在两点:
- 你先基于原始结构的DataFrame生成了Styler对象,再手动修改Styler的内部
.data属性的索引、排序规则。Styler初始化时已经缓存了原始数据的索引、行列结构信息到多个内部属性,单独修改.data不会同步更新这些缓存,导出Excel时Styler还是按照原始结构匹配数据,自然找不到修改后的多级索引项,触发KeyError。 .data属于Styler的内部属性,pandas没有对外承诺该属性的修改兼容性,直接手动修改属于非规范操作,非常容易出现结构不一致问题。
解决方案
调整操作顺序:先完成所有数据层面的索引设置、排序操作,再生成Styler对象应用样式即可,修改后的可运行代码如下:
import pandas as pd import numpy as np dict_map=dict(group_one=['D','GG','G'],group_two=['A','C','E','F']) nn=np.array([['foo', '*', 'bar','ff'], ['foo', '*', 'bar','**'], ['foo', '*', 'bar','**'],['foo', '*', 'bar','ff'], ['foo', '*', '**','ff']]) arrays = [["bar", "bar", "baz", "baz"], ["one", "two", "one", "two"]] tuples = list(zip(*arrays)) index = pd.MultiIndex.from_tuples(tuples, names=["first", "second"]) df = pd.DataFrame(nn, index=["A", "B", "C","D",'G'], columns=index) df = df.rename_axis(index=['my_ch']).reset_index() d = {i:k for k,v in dict_map.items() for i in v} out = df.assign(Group=df.xs("my_ch",axis=1).map(d).fillna('Other')) # 先做数据层面的索引设置、排序,再生成样式 out = out.set_index(['Group', 'my_ch']).sort_index(level=0) def highlight_(s): return np.select( condlist=[s.str.contains('\*\*'), s.str.contains('\*')], choicelist=['background-color:green', 'background-color:purple'], default='') # 处理完数据结构后再生成Styler对象 df_style = out.style.apply(highlight_) df_style.to_excel('n1test.xlsx')
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

