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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:12:02