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

Pandas按年聚合记录循环生成保存柱状图异常问题求解

原代码错误点

你的代码有3个核心问题,直接导致循环逻辑失效、运行中断:

  • 变量复用冲突:你把i同时作为循环迭代变量和数字计数器使用,执行for i in dd时,i会被依次赋值为dd列表里的每个DataFrame分组,完全覆盖掉你之前定义的整数计数器,后续的索引取值逻辑从根源上就错了。
  • 自增运算符写反:i =+ 1 是将i直接赋值为正整数1,不是计数器自增1(正确自增写法是i += 1),就算没有变量冲突,这行代码也不会让计数器逐次递增,永远固定为1。
  • 未清理画布资源:每次调用plot画图后没有关闭matplotlib画布对象,后续循环的绘图内容会叠加在之前的图层上,内存占用会持续升高,很容易触发程序异常终止。
更优雅的实现方案

完全不需要提前把分组结果转成列表存储,直接遍历groupby的返回值即可,代码更简洁、内存占用更低,也不会出现索引相关的错误:

import matplotlib.pyplot as plt

# 直接遍历分组结果,同时拿到年份值和对应分组的DataFrame
for year, group_data in df.groupby('year'):
    # 统计当前年份的期刊类型分布,绘制柱状图
    ax = group_data['Journal Type'].value_counts().plot(
        kind='bar',
        title=f'Journal Type Distribution - {year}'
    )
    fig = ax.get_figure()
    # 自动调整布局,避免标签、标题被截断
    fig.tight_layout()
    # 保存图片,直接用年份作为文件名
    fig.savefig(f'{year}.png')
    # 关闭当前画布,释放内存,避免图层叠加
    plt.close(fig)

方案优势

  • 省去分组转列表、按索引取值的步骤,直接在遍历分组时拿到需要的年份值和对应数据,从根源避免索引越界、变量冲突问题。
  • 变量名语义清晰,用year、group_data代替单字母变量,后续维护时不需要反复猜变量含义。
  • 增加布局自动调整逻辑,导出的图片不会出现文字截断的问题。
  • 每次存图后主动关闭画布,循环过程中内存占用稳定,不会出现多图叠加、程序中途崩溃的问题,可以顺利跑完所有56个年份的绘图任务。

内容的提问来源于stack exchange,提问作者K3it4r0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 20:18:29