Groupby结果未含分组列致seaborn countplot报错,如何解决?
问题:分组后索引列缺失导致Seaborn可视化KeyError
你已经完成了按销售员工分组的统计工作,但在用Seaborn的countplot做可视化时,碰到了KeyError: 'sales_person_name2'的问题——原因很简单:分组后sales_person_name2变成了DataFrame的索引,不再是普通列,所以直接按列名调用就会报错。
你的分组代码如下:
df_RFQ_by_Salesperson = df[ (df['state'].str.contains('Done')) ][['sales_person_name2', 'rfq_qty', 'rfq_qty_CAD_Equiv', 'state' ]].copy() df_RFQ_by_Salesperson = df_RFQ_by_Salesperson.groupby('sales_person_name2').agg({'state': 'size','rfq_qty': 'sum', 'rfq_qty_CAD_Equiv': 'sum'}) df_RFQ_by_Salesperson['Percentage'] = df_RFQ_by_Salesperson.rfq_qty_CAD_Equiv / df_RFQ_by_Salesperson.rfq_qty_CAD_Equiv.sum() df_RFQ_by_Salesperson = df_RFQ_by_Salesperson.rename(columns={'state':'Done Trades'}, level=0) display(df_RFQ_by_Salesperson.sort_values('Percentage',ascending=False))
查看列时能看到sales_person_name2确实不在列列表里:
display(df_RFQ_by_Salesperson.columns) # 输出:Index(['Done Trades', 'rfq_qty', 'rfq_qty_CAD_Equiv', 'Percentage'], dtype='object')
可视化代码的报错点:
ax = sns.countplot( x='sales_person_name2', data=df_RFQ_by_Salesperson, order = df_RFQ_by_Salesperson['sales_person_name2'].value_counts().index, color=plot_colour ) # 报错:KeyError: 'sales_person_name2'
两种解决方法:把索引转为普通列
方法1:分组时直接保留分组键为列
在groupby里添加as_index=False参数,这样分组后sales_person_name2会直接作为普通列保留,不用后续调整:
df_RFQ_by_Salesperson = df[df['state'].str.contains('Done')][['sales_person_name2', 'rfq_qty', 'rfq_qty_CAD_Equiv', 'state' ]].copy() # 添加as_index=False,让分组键保留为列 df_RFQ_by_Salesperson = df_RFQ_by_Salesperson.groupby('sales_person_name2', as_index=False).agg({ 'state': 'size', 'rfq_qty': 'sum', 'rfq_qty_CAD_Equiv': 'sum' }) df_RFQ_by_Salesperson['Percentage'] = df_RFQ_by_Salesperson.rfq_qty_CAD_Equiv / df_RFQ_by_Salesperson.rfq_qty_CAD_Equiv.sum() df_RFQ_by_Salesperson = df_RFQ_by_Salesperson.rename(columns={'state':'Done Trades'}, level=0) display(df_RFQ_by_Salesperson.sort_values('Percentage',ascending=False))
方法2:对已分组的DataFrame重置索引
如果你已经完成了分组统计,不想重新跑分组代码,可以用reset_index()把索引转为普通列:
# 在分组完成后执行这一行 df_RFQ_by_Salesperson = df_RFQ_by_Salesperson.reset_index() # 现在查看列就会包含sales_person_name2了 display(df_RFQ_by_Salesperson.columns)
可视化代码的小调整
处理完之后,你的可视化代码可以正常运行,另外注意order参数可以简化:
# 先按Percentage降序排序 df_RFQ_by_Salesperson.sort_values('Percentage', ascending=False, inplace=True) ax = sns.countplot( x='sales_person_name2', data=df_RFQ_by_Salesperson, # 直接用排序后的销售人名单作为顺序 order = df_RFQ_by_Salesperson['sales_person_name2'], color=plot_colour ) for label in ax.xaxis.get_ticklabels(): label.set_rotation(90) plt.show()
内容的提问来源于stack exchange,提问作者Peter Lucas
相关产品推荐
相关产品推荐

