如何在Pandas循环中拼接DataFrame的Abs列并统计均值/中位数?
批量处理CSV吸光度数据:拼接列并计算统计量
看起来你已经搭好了批量读取文件的基础框架,接下来只需要把每个文件的Abs列收集到同一个DataFrame里,再按行计算统计量就可以了。我帮你优化了代码,直接就能用:
完整代码示例
import pandas as pd import glob # 获取目标文件夹下所有排序后的CSV文件路径 file_paths = sorted(glob.glob('blanks/Day01/Batch02/*.csv')) # 初始化结果DataFrame:先读取第一个文件的波长列作为基础 result_df = pd.read_csv(file_paths[0], skiprows=1, delimiter=',')[['Wavelength (nm)']] # 遍历每个文件,提取Abs列并加入结果表 for file_path in file_paths: # 用文件名作为Abs列的名称(去掉.csv后缀,方便识别来源) col_name = file_path.split('/')[-1].replace('.csv', '') # 读取当前文件的Abs列 df = pd.read_csv(file_path, skiprows=1, delimiter=',') # 可选:检查当前文件的波长列是否和基准一致,避免数据错位 if not df['Wavelength (nm)'].equals(result_df['Wavelength (nm)']): print(f"⚠️ 警告:文件 {col_name} 的波长列与其他文件不匹配,已跳过该文件") continue # 将Abs列加入结果表 result_df[col_name] = df['Abs'] # 计算统计列:均值、中位数、标准差(按行计算,对应每个波长的统计值) result_df['Abs_Mean'] = result_df.drop('Wavelength (nm)', axis=1).mean(axis=1) result_df['Abs_Median'] = result_df.drop('Wavelength (nm)', axis=1).median(axis=1) result_df['Abs_Std'] = result_df.drop('Wavelength (nm)', axis=1).std(axis=1) # 保存最终统计结果到新CSV result_df.to_csv('blanks/Day01/Batch02/abs_statistics.csv', index=False)
关键细节说明
- 列命名:用文件名作为每个
Abs列的名称,后续你能清楚知道每个数据来自哪个文件,排查问题更方便。 - 波长一致性检查:加了可选的检查步骤,防止因为某个文件波长错位导致统计结果出错,如果你的数据确认波长完全一致,可以删掉这段。
- 统计量计算:
mean(axis=1)和median(axis=1)是按行计算,也就是针对每个波长,计算所有文件吸光度的均值/中位数,这正是实验数据分析中常用的统计方式。 - 结果保存:最终生成的CSV会包含原始所有文件的Abs列,加上你需要的均值、中位数、标准差列,方便后续分析或绘图。
如果你的数据集里有空文件或者格式异常的文件,还可以在读取时加上try-except块来捕获错误,避免程序中断。
内容的提问来源于stack exchange,提问作者PEBKAC
相关产品推荐
相关产品推荐

