Pandas透视表删除行触发Key Error问题求助及多索引必要性咨询
搞定Pandas透视表删除行的KeyError问题
嘿,我来帮你理清这个问题!先直接回答你的核心疑问:多索引在你这个场景里真不是必须的——除非你之后还要基于多层列结构做复杂分析。从你贴的代码来看,你手动重构了列的MultiIndex,但其实如果只是按区县和年份统计私立学校数量,完全可以把列结构简化,这样后续删行操作会顺畅很多。
为啥会触发KeyError?
大概率是这两个原因:要么你要删的行索引值(也就是CountyName的某个县名)根本不在透视表的行索引里,要么你操作时不小心把行索引和列的MultiIndex搞混了,用了错误的索引值格式。
最实用的解决方法(分两种场景)
场景1:不需要保留多列索引,先简化结构
直接把透视表的列扁平化,操作起来和普通DataFrame一模一样:
# 生成透视表时,直接处理列名避免MultiIndex ps_total = ps.pivot_table( index="CountyName", columns="Year", values=["Number of Private Schools"], aggfunc=np.sum ).reset_index() # 把多层列名合并成单层,比如把('Number of Private Schools', 2020)改成'2020_Private_Schools' ps_total.columns = ['_'.join(map(str, col)).strip('_') for col in ps_total.columns.values] # 现在删行就简单了!比如删除名为'XX县'的行 ps_total = ps_total[ps_total['CountyName'] != 'XX县'] # 或者知道行号的话用drop: ps_total = ps_total.drop([0, 2])
场景2:必须保留多列索引(比如后续要做多层分析)
如果一定要留着MultiIndex列也没关系,因为你的行索引还是单层的(就是CountyName),删行逻辑和普通表一样,关键是先确认目标值存在:
# 先打印行索引列表,确认你要删的县名在里面 print(ps_total.index.tolist()) # 确认存在的话,直接用drop删除指定行(传的是CountyName的值) ps_total = ps_total.drop(['目标县名1', '目标县名2']) # 或者用条件筛选排除要删的行: ps_total = ps_total[~ps_total.index.isin(['要删除的县名'])]
小提示
下次再碰到KeyError,先打印ps_total.index看看行索引到底有哪些值——很多时候都是拼写错误,或者你以为存在的县名其实没出现在透视表里。要是你的行索引也是MultiIndex(比如设置了多个index参数),那删行时才需要传元组,比如drop([('县A', '类型X')]),但你的案例里行索引是单层的,完全不用考虑这个~
内容的提问来源于stack exchange,提问作者Glenn G.
相关产品推荐
相关产品推荐

