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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:53:22