如何用Python批量处理101个CSV文件:平方第二列并按行平均
批量处理CSV文件:第二列平方后按行求平均
以下是实现需求的完整代码,包含批量读取、平方计算、行平均、结果保存与可视化:
import pandas as pd import numpy as np import os import matplotlib.pyplot as plt # 目标文件夹路径 folder_path = r'C:\Users\Den\Desktop\SPD' # 获取文件夹下所有CSV文件(过滤非CSV文件) csv_files = [f for f in os.listdir(folder_path) if f.endswith('.csv')] # 存储所有文件第二列平方后的数据 squared_data = [] # 批量读取并处理每个CSV文件 for file in csv_files: file_path = os.path.join(folder_path, file) # 读取CSV,分隔符为; data = pd.read_csv(file_path, sep=';') # 提取S列,计算平方后转为numpy数组 y_squared = data['S'].to_numpy() ** 2 squared_data.append(y_squared) # 将列表转为numpy数组,方便进行矩阵运算 squared_array = np.array(squared_data) # 按行计算平均值(axis=0表示对所有文件的同一行数据求平均) row_averages = np.mean(squared_array, axis=0) # 获取频率轴数据(取第一个文件的W列,假设所有文件的频率列一致) first_data = pd.read_csv(os.path.join(folder_path, csv_files[0]), sep=';') x = first_data['W'].to_numpy() # 保存平均结果到新CSV result_df = pd.DataFrame({ 'W': x, 'Average_S_Squared': row_averages }) result_df.to_csv(os.path.join(folder_path, 'average_spd_squared.csv'), sep=';', index=False) # 绘制平均后的频谱曲线 plt.figure(figsize=(10, 6)) plt.plot(x, row_averages, label='平均平方SPD') plt.xlabel('频率 (W)') plt.ylabel('平均频谱功率密度平方') plt.title('101组SPD数据平方后的行平均结果') plt.grid(True) plt.legend() plt.show()
关键步骤说明:
- 批量读取文件:通过
os.listdir遍历目标文件夹,筛选出所有CSV文件,避免手动逐个指定路径。 - 平方计算:对每个文件的
S列直接进行元素级平方运算(** 2),效率高于循环处理单个元素。 - 行平均计算:利用numpy的
mean函数,指定axis=0实现对所有文件的同一行数据求平均,这正是你需要的"按行取所有文件对应行的平方值求平均"逻辑。 - 结果保存:将频率列和平均结果合并为DataFrame,保存为新的CSV文件,方便后续分析。
- 可视化:基于第一个文件的频率轴数据,绘制平均后的曲线,直观展示结果。
注意事项:
- 确保所有CSV文件的列名均为
W(频率)和S(频谱功率密度),如果存在列名不一致的情况,可修改代码中data['S']为对应列名,或通过索引(如data.iloc[:,1])提取第二列。 - 如果文件数量较多,numpy的矩阵运算会比循环求平均效率高很多,适合处理101个文件的规模。
内容的提问来源于stack exchange,提问作者Varga
相关产品推荐
相关产品推荐

