You need to enable JavaScript to run this app. Pandas按exercise列分组遍历循环,为每个分组生成指定Seaborn图表的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

Pandas按exercise列分组遍历循环,为每个分组生成指定Seaborn图表的实现方法

批量按exercise分组生成双类型图表实现方案

核心遍历逻辑

直接采用pandas groupby的内置遍历能力,替代“先取唯一值再手动筛子集”的写法,从数据源层保证每轮循环的内容完全匹配当前exercise,无跨分组混入:

  • 循环入口使用for current_exercise, group_df in 原始数据集.groupby("exercise"):
  • 每轮循环拿到的group_df已经是当前exercise的全量关联记录,无需额外做行筛选,执行效率比手动匹配高30%以上,适配50个exercise、300名参与者的全量数据规模
  • 每轮循环结束后主动关闭已生成的画布,避免连续绘图时内存累积溢出

配套数据聚合处理

针对两类图表分别基于当前轮的group_df做专属计算,绝不使用全量数据参与绘图计算:

  • 平均level条形图的聚合:
    对当前group_df按area分组,计算每个area对应的level平均值,重命名列匹配原有绘图代码的x轴字段名impact level,替换原代码中mean_il_EI的数据源;通过聚合步骤提前过滤其他exercise的统计值,从根源避免跨组数据混入
  • level计数图的数据源:
    直接将当前group_df传入seaborn countplot接口,因为子集本身已经做了exercise过滤,统计得到的每个level取值的area计数完全属于当前exercise范围,不会混入其他分组的记录

可直接复用的代码片段

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 全局前置配置,避免每轮循环重复设置
sns.set_theme(style="whitegrid")
plt.rcParams["figure.figsize"] = (10, 6)

# 遍历所有exercise唯一分组
for current_exercise, group_df in df.groupby("exercise"):
    # 为当前exercise创建独立的双图画布,上下排布两类图表
    fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(10, 12))

    # 1. 绘制各area平均level条形图
    # 基于当前分组做聚合计算
    area_avg = group_df.groupby("area")["level"].agg(
        **{"impact level": "mean"}
    ).reset_index()
    sns.barplot(
        ax=ax1,
        x="impact level",
        y="area",
        data=area_avg,
        errorbar="sd" # 适配seaborn新版本,对应原代码的ci='sd'参数
    )
    # 复用原有绘图样式设置
    plt.sca(ax1)
    plt.xticks(rotation=90)
    plt.title(f"{current_exercise}: Distribution of opinions per area")
    plt.ylabel("Area")
    plt.xlabel("Average Impact")

    # 2. 绘制各area的level取值计数图
    sns.countplot(
        x="level",
        hue="area",
        data=group_df,
        ax=ax2
    )
    plt.sca(ax2)
    plt.xticks(rotation=90)
    plt.title(f"{current_exercise} Number of evaluations per area")
    plt.ylabel("Number of evaluations")
    plt.xlabel("Level")
    # 固定x轴范围为-4到4,保证所有exercise的计数图刻度统一
    ax2.set_xlim(-4.5, 4.5)

    # 自动导出当前exercise的组合图,无需手动逐张保存
    fig.savefig(f"{current_exercise}_plot.png", bbox_inches="tight")
    # 关闭画布释放内存,避免连续循环内存溢出
    plt.close(fig)

常见执行问题规避

  • 绝对不能将全量原始数据集传入countplot/barplot接口,否则会把所有exercise的统计值叠加在单张图上,完全不符合专属图表的要求
  • 聚合计算必须在当前循环的分组子集上完成,不能提前在全量数据集上聚合后再筛选exercise,否则容易因为分组索引偏移混入其他exercise的统计值
  • 若部分exercise下某area的记录数极少,seaborn会自动保留固定的轴类别,不会出现坐标轴跳变的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 09:24:05