pandas pivot透视表使用列表推导式取值报KeyError如何解决
pandas透视表列表推导式取值KeyError问题排查
错误原因
- 取值顺序错误:pandas中
df[列标签][行标签]是先取列再取行,你的代码里把行索引dtDate的取值t放在了第一层级,而透视表的列是intHour类型,不存在dtDate类型的列标签,因此触发KeyError。 - 链式取值可靠性低:即使调整顺序,
[i][t]的写法也可能因为索引类型匹配问题、视图副本判断问题出现异常,更推荐用pandas官方建议的.loc显式索引。
正确实现方式
如果你确认T中存储的都是合法的dtDate行索引值、I中存储的都是合法的intHour列索引值,可使用以下方案:
方案1:使用loc显式索引(最稳妥,推荐)
loc的语法为pivot.loc[行索引, 列索引],直接明确指定索引层级,避免顺序混乱:
x = [pivot.loc[t, i] for t in T for i in I]
方案2:调整链式取值顺序(仅临时测试用,不推荐)
把列索引放在第一层级,行索引放在第二层级,适配pandas默认[]的索引逻辑:
x = [pivot[i][t] for t in T for i in I]
异常兼容写法
如果T或I里存在透视表中没有的索引值,可以加判断过滤避免报错:
x = [pivot.loc[t, i] for t in T if t in pivot.index for i in I if i in pivot.columns]
高性能批量取值方案
如果数据量较大,不需要用列表推导式,直接用pandas向量化操作性能更高:
x = pivot.loc[T, I].values.flatten().tolist()
内容的提问来源于stack exchange,提问作者Shax Studio
相关产品推荐
相关产品推荐

