如何用Python生成包含多CSV文件首尾行差值的报告
问题描述
我有多个CSV文件,表格包含时间列及多个数值列,首行为表头,后续是按时间排序的数据行。需要生成每个CSV文件首尾行差值的报告,报告格式要求以CSV文件名为标识,下方列出各列的首尾差值(列名与差值一一对应)。
现有一段计算首尾行差值的代码,请问如何修改代码,将结果写入独立文件并符合上述报告格式?
def csv_subtract(): # this is the extension you want to detect extension = '.csv' for root, dirs_list, files_list in os.walk(csv_file_path): for f in files_list: if os.path.splitext(f)[-1] == extension: file_name_path = os.path.join(root, f) df = pd.read_csv(file_name_path) diff_row = (df.iloc[len(df.index) - 1] - df.iloc[0]).to_frame()
解决方案
下面提供两种实现方式,分别对应汇总所有文件差值到一个报告和每个文件生成独立报告的需求:
方式1:生成汇总报告(所有文件差值合并到一个CSV)
修改后的代码会把所有CSV的首尾差值合并到一个文件里,每行对应一个CSV文件的结果,索引为文件名:
import os import pandas as pd def csv_subtract(): extension = '.csv' # 初始化空DataFrame存储汇总结果 total_report = pd.DataFrame() for root, _, files in os.walk(csv_file_path): for file in files: if os.path.splitext(file)[1] == extension: file_path = os.path.join(root, file) df = pd.read_csv(file_path) # 计算首尾行差值,转置为行格式并设置文件名为索引 diff_data = (df.iloc[-1] - df.iloc[0]).to_frame().T diff_data.index = [file] # 合并到汇总报告 total_report = pd.concat([total_report, diff_data]) # 写入汇总报告文件 total_report.to_csv('首尾差值汇总报告.csv', index=True)
方式2:每个CSV生成独立报告文件
如果需要为每个CSV单独生成差值报告,代码会在指定目录下创建对应文件:
import os import pandas as pd def csv_subtract(): extension = '.csv' # 创建报告输出目录(不存在则自动创建) output_folder = 'CSV差值报告' os.makedirs(output_folder, exist_ok=True) for root, _, files in os.walk(csv_file_path): for file in files: if os.path.splitext(file)[1] == extension: file_path = os.path.join(root, file) df = pd.read_csv(file_path) # 计算首尾行差值 diff_series = df.iloc[-1] - df.iloc[0] # 转换为指定格式的DataFrame(列名+差值) diff_report = pd.DataFrame({'差值': diff_series.values}, index=diff_series.index) # 生成报告文件名并写入 report_name = f"{os.path.splitext(file)[0]}_差值报告.csv" report_path = os.path.join(output_folder, report_name) diff_report.to_csv(report_path, index=True)
关键说明
df.iloc[-1]是获取最后一行的简洁写法,等价于原代码的df.iloc[len(df.index)-1]- 方式1通过转置(
.T)把差值Series转为行结构,方便多文件结果合并 - 方式2直接将差值转为“列名-差值”的格式,每个文件对应独立报告,更贴合单文件报告需求
os.makedirs(..., exist_ok=True)避免因目录不存在导致的报错
内容的提问来源于stack exchange,提问作者user2077648
相关产品推荐
相关产品推荐

