如何访问Pandas透视表的'All'列?解决d.loc[:,'All']触发KeyError问题
问题:无法访问透视表中的'All'列绘制柱状图
嘿,我之前也碰到过一模一样的问题!你这个透视表的列是**多层索引(MultiIndex)**结构,直接用'All'当列名去访问肯定会触发KeyError——因为它只是最内层的索引值,不是完整的列路径。
先给你拆解下这个透视表的列层级:运行print(d.columns)会看到类似这样的结果,能清楚看到列是三层嵌套的:
MultiIndex([('sum', 'Quantity', '601'), ('sum', 'Quantity', '631'), ('sum', 'Quantity', '641'), ('sum', 'Quantity', 'All')], names=[None, 'Quantity', 'MvT'])
针对这个情况,有两种实用的解决方法:
方法1:直接指定完整的多层列索引
用元组形式定位到目标列,之后就能正常绘图了:
import matplotlib.pyplot as plt import numpy as np # 精准定位到All列 all_quantities = d[('sum', 'Quantity', 'All')] # 绘制柱状图 all_quantities.plot(kind='bar', figsize=(8,5)) plt.title('Total Quantity per Material') plt.ylabel('Total Quantity') plt.xlabel('Material Type') plt.show()
如果不想把透视表最后一行的All(所有物料的汇总行)包含在图表里,可以加个drop去掉它:
all_quantities = d[('sum', 'Quantity', 'All')].drop('All')
方法2:扁平化列名(方便后续重复操作)
要是之后还要频繁调用这些列,可以先把多层列名合并成单层,这样就能像普通DataFrame一样用简单列名访问:
# 用下划线连接各层级,把列名扁平化 d.columns = ['_'.join(col) for col in d.columns] # 现在直接访问合并后的列名即可 all_quantities = d['sum_Quantity_All'] # 绘图代码和上面一致 all_quantities.plot(kind='bar') plt.show()
内容的提问来源于stack exchange,提问作者Luca Consorte
相关产品推荐
相关产品推荐

