按年龄组统计支出总和并绘制条形图的技术求助
解决各年龄组总支出条形图绘制问题
问题1分析与解决
你执行temp=df.groupby('AGE')['EXP'].sum()后,已经得到了每个年龄组对应总支出的Series对象。后续报错的原因是:
- 你调用了
temp.sum()(或temp3.sum(),推测是笔误),这会把所有年龄组的总支出再求和,得到单个numpy.float64数值,单个数值自然没有plot方法。 unstack(0)在这里完全多余,分组后的Series已经是AGE为索引、总支出为值的结构,无需拆分。
正确的绘图代码直接用分组后的结果即可:
temp = df.groupby('AGE')['EXP'].sum() temp.plot.barh() # 绘制水平条形图 # 若要垂直条形图,用 temp.plot.bar()
问题2分析与解决
你使用sns.barplot时犯了参数传递错误:
y=df['EXP'].values传入的是原始数据的所有支出值,而seaborn.barplot默认会对每个x分组(AGE)的y值计算均值,而非总和,这就是y轴数值远低于实际总支出的原因。
解决方法有两种:
方法1:指定estimator为求和
直接让seaborn对每个年龄组的EXP计算总和:
import seaborn as sns import matplotlib.pyplot as plt fig, ax = plt.subplots() sns.barplot(x='AGE', y='EXP', ci=0, ax=ax, data=df, estimator=sum) plt.show()
注意y参数传列名'EXP'即可,不要传df['EXP'].values,同时通过estimator=sum指定聚合方式为求和。
方法2:先分组求和再传入数据
用提前分组好的汇总数据绘图,逻辑更直观:
temp = df.groupby('AGE')['EXP'].sum().reset_index() # 转成DataFrame格式 sns.barplot(x='AGE', y='EXP', ci=0, ax=ax, data=temp)
内容的提问来源于stack exchange,提问作者user19706373
相关产品推荐
相关产品推荐

