2.8 计算每个文件中值的总和与均值
有些时候,当你有多个输入文件时,需要对每个输入文件计算一些统计量。本节的示例使用之前创建的 3 个 CSV 文件来展示如何计算每个输入文件中某一列的总计和均值。
01. 基础Python
要使用基础 Python 为多个文件计算某列的总计和均值,在文本编辑器中输入下列代码,然后将文件保存为 10csv_reader_sum_average_from_multiple_files:
1 #!/usr/bin/env python3 2 import csv 3 import glob 4 import os 5 import sys 6 input_path = sys.argv[1] 7 output_file = sys.argv[2] 8 output_header_list = ['file_name', 'total_sales', 'average_sales'] 9 csv_out_file = open(output_file, 'a', newline='') 10 filewriter = csv.writer(csv_out_file) 11 filewriter.writerow(output_header_list) 12 for input_file in glob.glob(os.path.join(input_path,'sales_*')): 13 with open(input_file, 'r', newline='') as csv_in_file: 14 filereader = csv.reader(csv_in_file) 15 output_list = [ ] 16 output_list.append(os.path.basename(input_file)) 17 header = next(filereader) 18 total_sales = 0.0 19 number_of_sales = 0.0 20 for row in filereader: 21 sale_amount = row[3] 22 total_sales += float(str(sale_amount).strip('$').replace(',','')) 23 number_of_sales += 1 24 average_sales = '{0:.2f}'.format(total_sales / number_of_sales) 25 output_list.append(total_sales) 26 output_list.append(average_sales) 27 filewriter.writerow(output_list) 28 csv_out_file.close()
第 8 行代码创建了一个输出文件的列标题列表。第 10 行代码创建了 filewriter 对象,第 11 行代码将标题行写入输出文件。
第 15 行代码创建了一个空列表,保存要写入输出文件中的每行输出。因为要为每个输入文件计算总计和均值,所以第 16 行代码将输入文件的文件名追加到 output_list 中。
第 17 行代码使用 next 函数除去每个输入文件的标题行。第 18 行代码创建了一个变量 total_sales 并将其初始化为 0。第 20 行代码是一个 for 循环,在每个输入文件的数据行之间迭代。
第 21 行代码使用列表索引取出销售额这列中的值,并赋给变量 sale_amount。第 22 行代码使用 str 函数确保 sale_amount 中的值是一个字符串,然后使用 strip 函数和 replace 函数除去值中的美元符号和逗号。此后使用 float 函数将这个值转换为浮点数,并将这个值加到 total_sales 中的值上。第 23 行代码给 number_of_sales 中的值加 1。
第 24 行代码用 total_sales 中的值除以 number_of_sales 中的值,为输入文件计算出平均销售额,然后将这个数值格式化成具有两位小数的数值,并转换成字符串,赋给变量 average_sales。
第 25 行代码将总销售额作为第二个值添加到 output_list 中。列表中的第一个值是输入文件的名字。这个值在第 16 行代码中被添加到列表中。第 26 行代码将平均销售额作为第三个值添加到 output_list 中。第 27 行代码将 output_list 中的值写入输出文件。
脚本对每个输入文件都运行这些代码,所以输出文件中会包含对应于每个输入文件的一列文件名、一列总销售额和一列平均销售额。
要运行这个脚本,在命令行中输入以下命令,然后按回车键:
python 10csv_reader_sum_average_from_multiple_files.py \ "C:\Users\Clinton\Desktop" output_files\10output.csv
你可以打开输出文件 10output.csv 查看一下结果。
02. pandas
pandas 提供了可以用来计算行和列统计量的摘要统计函数,比如 sum 和 mean。下面的代码演示了如何对于多个文件中的某一列计算这两个统计量(总计和均值),并将每个输入文件的计算结果写入输出文件。
要使用 pandas 计算这两个列统计量,在文本编辑器中输入下列代码,并将文件保存为 pandas_sum_average_from_multiple_files.py:
#!/usr/bin/env python3 import pandas as pd import glob import os import sys input_path = sys.argv[1] output_file = sys.argv[2] all_files = glob.glob(os.path.join(input_path,'sales_*')) all_data_frames = [] for input_file in all_files: data_frame = pd.read_csv(input_file, index_col=None) total_cost = pd.DataFrame([float(str(value).strip('$').replace(',','')) \ for value in data_frame.loc[:, 'Sale Amount']]).sum() average_cost = pd.DataFrame([float(str(value).strip('$').replace(',','')) \ for value in data_frame.loc[:, 'Sale Amount']]).mean() data = {'file_name': os.path.basename(input_file), 'total_sales': total_sales, 'average_sales': average_sales} all_data_frames.append(pd.DataFrame(data, \ columns=['file_name', 'total_sales', 'average_sales'])) data_frames_concat = pd.concat(all_data_frames, axis=0, ignore_index=True) data_frames_concat.to_csv(output_file, index = False)
使用列表生成式将销售额这一列中带美元符号的字符串转换为浮点数,然后使用数据框函数将这个对象转换为一个 DataFrame,以便可以使用这两个函数计算列的总计和均值。
因为输出文件中的每行应该包含输入文件名,以及文件中销售额的总计和均值,所以可以将这 3 种数据组合成一个文本框,使用 concat 函数将这些数据框连接成为一个数据框,然后将这个数据框写入输出文件。
要运行这个脚本,在命令行中输入以下命令,然后按回车键:
python pandas_ sum_average_from_multiple_files.py "C:\Users\Clinton\Desktop"\ output_files\pandas_output.csv
你可以打开输出文件 pandas_output.csv 查看一下结果。
本章介绍了很多基础知识,包括读取和分析 CSV 文件、在 CSV 文件中浏览行与列、处理多个 CSV 文件和为多个 CSV 文件计算统计量的方法。如果你一直跟随本章内容练习示例代码,应该已经完成了 12 个 Python 脚本。
你练习本章中示例代码的最大收获是,它们是浏览和处理文件的基础模块。掌握了本章中的示例代码后,你就可以继续学习如何处理 Excel 文件了,这就是下一章的主题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论