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

Python基于Pandas的分组列操作与试验数据自动化绘图问题

解决方案

错误原因

你遇到的报错是pandas列索引的语法问题:点语法df.列名仅适用于列名是固定字面量的场景,当列名存在循环变量中时,需要用方括号索引df[列名变量],你原来的循环取数代码可以改成如下即可正常运行:

data = pd.read_csv('data.csv')
col_names = data.columns.values.tolist()
for col in col_names:
    # 直接用方括号取对应列的Series
    series_data = data[col]
    print(series_data)

完整功能实现

以下代码同时满足你提出的两个需求:

  • 支持1秒重采样降噪(可直接替换为你自己写好的平滑函数)
  • 自动按每3组为一个批次绘图,自动计算每组试验的最大最小值
import pandas as pd
import matplotlib.pyplot as plt
import math

# 1. 读取数据并预处理列名
data = pd.read_csv('data.csv')
# 筛选所有波长列并按序号排序
wave_cols = [col for col in data.columns if col.startswith('wavelength')]
wave_cols.sort(key=lambda x: int(x.replace('wavelength','')))
total_trials = len(wave_cols)
# 计算需要的子图数量
total_figs = math.ceil(total_trials / 3)

# 2. 画布参数配置,可自行调整
n_rows = math.ceil(total_figs / 2)
n_cols = 2
font_size = 13
figure_size = (30, 15)
f, axs = plt.subplots(n_rows, n_cols, figsize=figure_size)
axs = axs.flatten() # 拉平子图数组方便索引

# 存储所有试验的统计结果
trial_stats = []

for fig_idx in range(total_figs):
    ax = axs[fig_idx]
    # 计算当前批次对应的试验编号范围
    start_trial = fig_idx * 3 + 1
    end_trial = min((fig_idx + 1) * 3, total_trials)
    
    # 遍历绘制当前批次的3组试验数据
    for trial_num in range(start_trial, end_trial + 1):
        time_col = f'time{trial_num}'
        wave_col = f'wavelength{trial_num}'
        x = data[time_col]
        y = data[wave_col]
        
        # ------------------- 降噪处理模块 -------------------
        # 方法1:1秒重采样降噪(原采样间隔0.25s,每4个点取均值)
        temp_df = pd.DataFrame({'y': y.values}, index=pd.to_datetime(x.values, unit='s'))
        y_smooth = temp_df.resample('1s').mean()['y'].values
        x_smooth = temp_df.resample('1s').mean().index.second.values
        # 方法2:直接替换为你自己的平滑函数,取消注释下方两行即可
        # y_smooth = 你的自定义平滑函数(y)
        # x_smooth = x
        
        # 绘制曲线
        ax.plot(x_smooth, y_smooth, label=f'Trial {trial_num}')
        
        # 计算并保存当前组的最大最小值
        trial_max = y_smooth.max()
        trial_min = y_smooth.min()
        trial_stats.append({
            '试验编号': trial_num,
            '最大吸光度(nm)': round(trial_max, 4),
            '最小吸光度(nm)': round(trial_min, 4)
        })
    
    # 子图样式配置,糖质量可按你的批次规则自行调整
    glucose_mass = 0.3 * (fig_idx + 1)
    ax.set_title(f'{glucose_mass}g Glucose', fontweight="bold", size=font_size)
    ax.set_ylabel('吸光度 (nm)', fontsize=font_size)
    ax.set_xlabel('时间 (s)', fontsize=font_size)
    ax.legend(fontsize=font_size)

# 隐藏多余的空子图
for ax in axs[total_figs:]:
    ax.axis('off')

plt.tight_layout()
plt.show()

# 输出统计结果,可取消注释下方行导出为csv文件
stats_df = pd.DataFrame(trial_stats)
print(stats_df)
# stats_df.to_csv('试验统计结果.csv', index=False, encoding='utf_8_sig')

补充说明

  • 如果批次对应的糖质量不是0.3g递增,可自行修改glucose_mass的赋值逻辑
  • 降噪模块已做单独标注,直接替换为你自己的平滑函数即可正常运行
  • 所有试验的最大最小值统计结果会直接打印在控制台,也支持导出为csv文件做后续分析

内容的提问来源于stack exchange,提问作者a tired engineer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:30:00