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
相关产品推荐
相关产品推荐

