
本文介绍使用pandas批量读取多个csv文件,对第二列数据逐行平方后跨文件求平均值的完整流程,涵盖文件合并、分组计算、结果可视化等关键步骤。
本文介绍使用pandas批量读取多个csv文件,对第二列数据逐行平方后跨文件求平均值的完整流程,涵盖文件合并、分组计算、结果可视化等关键步骤。
在科学数据分析中,常需对大量结构一致的CSV文件(如频谱功率密度实验数据)进行统一处理。本例涉及101个CSV文件,每个含10001行两列数据(如频率W与功率密度S),目标是:对每个文件的第二列(S)逐元素平方,再按行号对所有文件对应位置的平方值求平均——即得到一条长度为10001的“平均平方谱线”。
核心思路不是逐文件循环计算再手动拼接,而是利用Pandas的向量化操作与groupby+agg能力,将问题转化为按行索引对齐后跨文件聚合。但由于原始代码中groupby("filename")仅按文件分组(计算每文件的列均值),这与题目要求的“逐行平均”不符,需修正为基于行序号(而非文件名)对齐并聚合。
✅ 正确实现步骤如下:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
-
统一读取并添加行索引标识
读取每个CSV时,显式添加row_id列(从0开始的整数索引),确保所有文件的第i行具有相同row_id:
import os
import pandas as pd
import numpy as np
csv_folder = r"C:\Users\Den\Desktop\SPD" # 替换为你的CSV所在路径
frame_list = []
for file in os.listdir(csv_folder):
if file.endswith(".csv"):
filepath = os.path.join(csv_folder, file)
df = pd.read_csv(filepath, sep=";") # 假设列名为'W'和'S'
df["row_id"] = np.arange(len(df)) # 添加全局行号标识
df["s_sq"] = df["S"] ** 2 # 立即平方第二列
frame_list.append(df[["row_id", "s_sq"]]) # 只保留关键列,节省内存
# 合并所有DataFrame(纵向堆叠)
mega_df = pd.concat(frame_list, ignore_index=False) # 保持原始索引便于后续分组-
按行号分组,计算每行的平方值均值
使用groupby("row_id")对所有文件中相同行号的数据聚合,求s_sq的均值:
# 按行号分组,计算每行平方值的平均数
mean_per_row = mega_df.groupby("row_id")["s_sq"].mean().reset_index(name="s_sq_mean")
print(f"输出形状: {mean_per_row.shape}") # 应为 (10001, 2)-
可选:与原始横坐标(如频率W)对齐并绘图
若需绘制平均谱线,需从任一CSV中提取W列(因所有文件W序列一致),并与mean_per_row合并:
# 读取一个参考文件获取横坐标
ref_df = pd.read_csv(os.path.join(csv_folder, os.listdir(csv_folder)[0]), sep=";")
mean_per_row["W"] = ref_df["W"].values # 直接赋值(确保长度一致)
# 绘制平均谱线
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.plot(mean_per_row["W"], mean_per_row["s_sq_mean"], label="Avg. Squared SPD", linewidth=1.5)
plt.xlabel("Frequency (W)")
plt.ylabel("Mean(S²)")
plt.title("Averaged Squared Spectral Power Density")
plt.grid(True, alpha=0.3)
plt.legend()
plt.show()⚠️ 关键注意事项:
- 列名一致性:确保所有CSV中第二列名称统一(如均为"S"),否则需在读取时重命名;
- 内存优化:若文件极大,可改用chunksize分块读取,或使用dask.dataframe替代Pandas;
- 索引对齐:row_id必须严格对应物理行序(非DataFrame默认索引),故推荐用np.arange()生成;
- 缺失值处理:若某文件行数不足10001,groupby会自动忽略缺失行;如需补零,可在读取时用reindex()对齐。
通过此方法,101个文件的逐行平方均值计算可在数秒内完成,代码简洁、可扩展性强,适用于同类批量信号分析任务。

















